使用反射和codeDom实现C#插件开发(2)dll开发

这一篇介绍一下插件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
下一篇讲如何在主程序中调用该插件,并进行赋值和执行操作。
发布了34 篇原创文章 · 获赞 8 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/lzwdlut/article/details/51113007
今日推荐