c# DLL反射(转)

项目中常常要用到反射,反射对性能有一定的影响,但有时候为了通用,扩展等不的不使用。下面简单的说一下。

TestLib.dll里面有这样一个类

 

namespace TestLib

 

{

 

    public class TestInstanceClass

 

    {

        public string F = "F";

        public int Test()

 

        {

 

            return 250;

 

        }

 

        public int TestArg(int returnvalue)

 

        {

 

            return returnvalue;

 

        }

 

    }

 

    public class TestStaticClass

 

    {

 

        public static int Test()

 

        {

 

            return 250;

 

        }

 

        public static int TestArg(int returnvalue)

 

        {

 

            return returnvalue;

 

        }

 

    }

 

}

   下面是反射调用,先加载程序集,并创建类的实例

 

string path = "TestLib";

 

           //实例类,静态类的反射差别不大

 

           var assembly = Assembly.Load(path);//名字不用加.dll

 

           //assembly = Assembly.LoadFile(path+"TestLib.dll");//加载文件绝对路径

 

           //推荐使用Load,LoadFile多个dll路径不一样可能会重复加载

 

           var instance = assembly.CreateInstance("TestLib.TestInstanceClass");

下面是调用方法:

 

//无参方法

 

           var method = instance.GetType().GetMethod("Test");

 

           var result = method.Invoke(instance, null);//第二个可以是参数

 

           //测试带参数的

 

           var methodWithArg = instance.GetType().GetMethod("TestArg");

 

           var resultArg = methodWithArg.Invoke(instance, new object[] { 2500 });//第二个可以是参数

 

           //4.0  dynamic 调用 

 

           dynamic dynamicInstance = assembly.CreateInstance("TestLib.TestInstanceClass");

 

           var dynamicResult = dynamicInstance.Test();

 

           var dynamicResultWithAerg = dynamicInstance.TestArg(100);

 

           Console.WriteLine(result);//print 250

 

           Console.WriteLine(resultArg);//print 2500

 

           // dynamic 结果

 

           Console.WriteLine(dynamicResult);//print 250

 

           Console.WriteLine(dynamicResultWithAerg);//print 100

下面是字段:

 

//获取字段,设置值

var field = instance.GetType().GetField("F");

field.SetValue(instance, "testF");//静态类的话,instance也可以Null 

 

var value = field.GetValue(instance);//静态类的话,instance也可以Null

Console.WriteLine(value); 

 

//4.0 dynamic对象可以直接点

dynamicInstance.F = "dynamictestF";//直接设置值

Console.WriteLine(dynamicInstance.F

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值