vb.net动态加载dll并执行dll中的某一个函数
注意:下面的Dll文件必须是用托管代码写的,否则请使用API的相应函数进行动态加载。 一、 比如我事先写了一个类,如下: PublicClassTestClass PublicFunctionAdd(ByValadd1AsInteger,ByValadd2AsInteger)AsInteger Returnadd1+add2 EndFunction EndClass 然后编译成了ClassDll.dll文件. 二、 在另一个程序中,我写入了如下代码 PublicFunctionAdd(ByValadd1AsInteger,ByValadd2AsInteger)AsInteger DimasmAsSystem.Reflection.Assembly=System.Reflection.Assembly.LoadFile("ClassDll.dll") DimclasstempAsType=asm.GetType("ClassDll.TestClass") '区分大小写,wenjian ming bu neng xiangtong DimobjAsObject=asm.CreateInstance(classtemp.FullName) Dimme_InfoAsSystem.Reflection.MethodInfo=classtemp.GetMethod("Add") Dimparamter(1)AsObject paramter(0)=add1 paramter(1)=add2 Returnme_Info.Invoke(obj,paramter) EndFunction 执行上面的Add函数其功能和执行一中的Add函数是一样的。
当然,执行上面的函数的另一种方法是:(之前我用上面的方法反射执行一个exe文件里的函数时,总是失败,但是按照下面的方法就可以成功执行,你要是遇到问题时,不妨按照下面的方法试一试) PublicFunctionAdd(ByValadd1AsInteger,ByValadd2AsInteger)AsInteger DimasmAsSystem.Reflection.Assembly=System.Reflection.Assembly.LoadFile("ClassDll.dll") DimclasstempAsType=asm.GetType("ClassDll.TestClass") DimobjAsObject=asm.CreateInstance(classtemp.FullName) ReturnCallByName(obj,"Add",vbMethod,add1,add2)'这里特别注意CallByName的用法 EndFunction 1、上面的System.Reflection.Assembly.LoadFile("ClassDll.dll")这一句里的ClassDll.dll是我们编译的那个dll文件。如果其不是放在程序目录下,这里必须换成ClassDll.dll的绝对路径。 2、DimclasstempAsType=asm.GetType("ClassDll.TestClass")这里的ClassDll.dll.TestClass类为什么不是我们定义的那个TestClass类呢(ClassDll.dll是我们的dll名称),你自己打开那个dll文件看一下就知道答案了。即我们用的时候类的前面必须加上我们的dll的名称再加一个点,才构成我们的类。 3、paramter是我们函数要接收的参数。可以通过paramter来传递数据。 经测试,在wince下同样适用
同样,如何捕捉触发事件 classtemp.GetType().AddEventHandler(obj,AddressOfobj_Timer) (IDutyDao)Assembly.Load(m_path).CreateInstance(className); 上述代码表示使用缺省无参数的构造函数创建一个对象实例,如果要在创建对象实例的时候调用有参数的构造函数该如何实现呢? 考帮助文档使用重载的CreateInstance方法来创建对象实例的代码如下: (IDutyDao)Assembly.Load(m_path).CreateInstance(className,false,BindingFlags.Public,null, newobject[] { dataSource },null,null); 结果不行,报错: System.MissingMethodException: System.MissingMethodException: 未找到类型 “ToTop.CSIM.DAL.DaoSqlServerImpl.DutyDaoImpl”上的构造函数。 经过多次尝试和网上搜索均未果,找到的都是一些提出遇到了同样问题却没有解决办法的帖子,最后静下心来详细查看该重载方法的帮助文档, 发现第三个参数有文章,将代码调整如下: (IDutyDao)Assembly.Load(m_path).CreateInstance(className, BindingFlags.Public |BindingFlags.CreateInstance,newobject[] { dataSource },null); 结果还不行,报同样的错误,于是只保留BindingFlags.CreateInstance继续测试,将代码调整如下: (IDutyDao)Assembly.Load(m_path).CreateInstance(className,BindingFlags.CreateInstance, null,null); 上述代码测试通过! 上述方法中的具体参数说明可参阅帮助文档。 在使用.NET创建的程序或组件时,元数据(metadata)和代码(code)都存储于“自成一体”的单元中,这个单元称为装配件。我们可以在程序运行期间访问这些信息。 以下摘自百度:http://zhidao.baidu.com/question/294391411.html 个人肤浅理解,反射实际上就是得到程序集中的属性和方法. 实现步骤: 1,导入using System.Reflection; 2,Assembly.Load("程序集")加载程序集,返回类型是一个Assembly 3, foreach (Type type in assembly.GetTypes()) { string t = type.Name; } 得到程序集中所有类的名称 4,Type type = assembly.GetType("程序集.类名");获取当前类的类型 5,Activator.CreateInstance(type); 创建此类型实例 6,MethodInfo mInfo = type.GetMethod("方法名");获取当前方法 7,mInfo.Invoke(null,方法参数); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |