这一篇介绍一下插件dll的开发。
这个dll很简单,只有几个输入变量,string,int,double,bool和string[] 基本类型,高级类型不知道行不行。
一个输出变量,当前只能够获取到静态变量的值,普通变量值获取还没有实现。
函数有三个,两个实现的接口的,一个自己定义的。
上一篇说到,dll插件要遵守一些约定,才能被集成到主程序中。这些约定是什么,每个人都有自己的标准,以下说一下我的约定。
1.定义一个接口,包含所有需要主程序调用的函数。这个接口可以单独成为一个类库。
直接上代码吧;
1)首先,新建一个项目,命名为someInterface,添加一个接口文件,命名为IdllFunc.cs;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace someInterface
{
public interface IdllFunc
{
void makeSomeMoney(double money);
void showMsg(string xx);
}
}
里面包含两个函数,makeSomeMoney和showMsg;
2)编译成类库,供后面使用。
2.定义一些属性,用来标记插件及插件中的参数等。
1)新建一个项目,命名为标记属性,添加一个类文件,命名为someAttributeClass.cs;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
namespace 标记属性
{
//使用反射时,通过该标记判断,程序集是否符合主程序要求的规范,可以被主程序调用
[AttributeUsage(AttributeTargets.Assembly)]
public class canUsedBySystem : Attribute
{
}
//标记该类是否用来和主程序交互;
[AttributeUsage(AttributeTargets.Class)]
public class AInteraction : Attribute
{
}
//标记该方法是否可以调用
[AttributeUsage(AttributeTargets.Method)]
public class AcanRun : Attribute
{
}
//dll中,标记参数是否是需要主程序获得的参数
[AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = false)]
public class AIsInput : Attribute
{
}
//dll中,标记参数是否是需要主程序获取并输出展示的参数
[AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = false)]
public class AIsOutput : Attribute
{
}
//dll中,参数的默认值标记
[AttributeUsage(AttributeTargets.Field,AllowMultiple=false,Inherited=false)]
public class ADefaultValues : Attribute
{
public ADefaultValues(object obj)
{
}
public ADefaultValues(object[] obj)
{
}
}
//dll中,对参数标记物理意义,便于理解
[AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = false)]
public class AMessage : Attribute
{
public AMessage(string msg)
{
}
}
}
2)编译成dll待用。
我的所有约定完成了。下面开始进行插件的开发。
1.新建一个项目,命名为0331测试的Person类;添加一个类,名为Person.cs;
2.添加引用,将刚才开发的两个dll添加到引用。
3.编写Person类。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using 标记属性;
using someInterface;
//标记该程序集是否可以被主程序调用
[assembly: canUsedBySystem]
namespace _0331测试的Person类
{
//标记这个Person类用来与主程序交互,包括用到的一些参数和函数
[AInteraction]
public class Person:IdllFunc
{
[AIsInput,ADefaultValues("ciwei"),AMessage("人名")] //标记name 是输入参数,默认值为ciwei,参数说明是人名
public string name = "";
[AIsInput,ADefaultValues(1),AMessage("年龄")]
public int age = 0;
[AIsInput,ADefaultValues(1e6),AMessage("原有资金")]
public double money = 0;
[AIsInput,ADefaultValues(true),AMessage("性别")]
public bool isMan = true;
[AIsInput, ADefaultValues(new object[] { "CAE" , "system implement","Program" }), AMessage("从事工作")]
public string[] career = new string[3];
//标记haveMoney是一个输出变量,参数说明是现有资金,
//当前只能获取静态变量,普通变量怎么获取,还没查到。
[AIsOutput,AMessage("现有资金")]
public static double haveMoney;
//实现接口1
public void makeSomeMoney(double money2)
{
haveMoney = money + money2;
}
//实现接口2
public void showMsg(string xx)
{
string xb = "男";
if (isMan == false)
xb = "女";
StringBuilder sb = new StringBuilder();
sb.Append("传入的参数是:" + xx + "\n");
sb.Append("姓名:" + name + "\n");
sb.Append("年龄:" + age.ToString() + "\n");
sb.Append("我的性别:" + xb + "\n");
sb.Append("从事工作:");
foreach (string x in career)
sb.Append(x+",");
sb.Append("\n");
sb.Append("输入之后的资产:" + haveMoney.ToString() + "\n");
Console.WriteLine(sb.ToString());
}
//该插件特有的一些函数,使用标记,标记该函数虽不在接口中,但是也是可以被主程序调用的。
[AcanRun]
public void showMyMsg()
{
Console.WriteLine("我不是接口的函数,但是我可以被调用,因为主程序约定可以调用无参函数,哇哈哈!");
}
}
}
4.编译,生成一个名为0331测试的Person类的dll
下一篇讲如何在主程序中调用该插件,并进行赋值和执行操作。
转载于:https://my.oschina.net/interestingCode/blog/657297