Csharp/C#教程:C#动态加载dll扩展系统功能的方法分享

本文实例讲述了C#动态加载dll扩展系统功能的方法。分享给大家供大家参考。具体分析如下:

动态加载dll,主要是为了扩展功能,增强灵活性而实现的。主要通过xml配置,来获取所有要动态加载的dll,然后通过反射机制来调用dll中的类及其方法。

usingSystem; usingSystem.Collections.Generic; usingSystem.IO; usingSystem.Linq; usingSystem.Reflection; usingSystem.Text; usingSystem.Threading.Tasks; namespaceDynamicLoadDLL { ///<summary> ///动态加载dll ///</summary> publicclassLoadDLL { privateAssemblyass=null; ///<summary> ///加载dll ///</summary> ///<paramname="dllPath">dll文件路径</param> publicLoadDLL(stringdllPath) { this.ass=Assembly.LoadFrom(dllPath); //利用dll的路径加载(fullname) } ///<summary> ///返回反射的dll ///</summary> ///<returns></returns> publicAssemblyGetAssembly() { returnthis.ass; } ///<summary> ///获取所有类名 ///</summary> ///<returns></returns> publicType[]GetClass() { returnass.GetTypes(); } ///<summary> ///获取程序集下的所有文件名 ///</summary> ///<returns></returns> publicModule[]GetModules() { returnass.GetModules(); } ///<summary> ///获取程序集清单文件表中的文件 ///</summary> ///<returns></returns> publicFileStream[]GetFiles() { returnass.GetFiles(); } } }

这个是加载dll的,然后返回一个Assembly类型的一个反射值,如果该dll中有多个命名空间和类的话,就只用一个Assembly类型的一个反射值即可以完成调用,否则每次生成一个类,都需要反射一次。IO操作相对而言是比较耗费CPU,影响效率的。

usingSystem; usingSystem.Collections.Generic; usingSystem.Linq; usingSystem.Reflection; usingSystem.Text; usingSystem.Threading.Tasks; namespaceDynamicLoadDLL { ///<summary> ///加载类 ///</summary> publicclassLoadClass { privatestaticLoadClassdlc=null; privateTypetype; privateobjectobj=null; //实例 ///<summary> ///加载dll ///</summary> ///<paramname="ass">dll引用</param> ///<paramname="nameSpace">类的命名空间</param> ///<paramname="classPath">类名称</param> privateLoadClass(Assemblyass,stringnameSpace,stringclassPath) { //加载dll后,需要使用dll中某类. type=ass.GetType(nameSpace+"."+classPath); //利用类型的命名空间和名称获得类型 //需要实例化类型,才可以使用, //参数可以人为的指定,也可以无参数,静态实例可以省略 obj=Activator.CreateInstance(type); //利用指定的参数实例话类型 } ///<summary> ///加载dll ///</summary> ///<paramname="ass">dll引用</param> ///<paramname="nameSpace">类的命名空间</param> ///<paramname="classPath">类名称</param> publicstaticLoadClassGetInstance(Assemblyass,stringnameSpace,stringclassPath) { if(dlc==null) { dlc=newLoadClass(ass,nameSpace,classPath); } returndlc; } ///<summary> ///获取属性集 ///</summary> ///<returns>返回属性值</returns> publicPropertyInfo[]GetAttrs() { //调用类型中的某个属性: PropertyInfo[]prop=type.GetProperties(); //通过属性名称获得属性 //返回属性集 returnprop; } publicMethodInfo[]GetMethods() { //调用类型中的方法: MethodInfo[]method=type.GetMethods(BindingFlags.NonPublic); //获得方法集 //返回方法集 returnmethod; } ///<summary> ///获取属性值 ///</summary> ///<paramname="attrName">属性名称</param> ///<returns>返回属性值</returns> publicobjectGetAttrValue(stringattrName) { //调用类型中的某个属性: PropertyInfoprop=type.GetProperty(attrName); //通过属性名称获得属性 //返回属性值 returnprop.GetValue(obj); } ///<summary> ///设置属性值 ///</summary> ///<paramname="attrName">属性名称</param> ///<returns>返回属性值</returns> publicvoidSetAttrValue(stringattrName,stringattrValue) { //调用类型中的某个属性: PropertyInfoprop=type.GetProperty(attrName); //通过属性名称获得属性 //返回属性值 prop.SetValue(obj,attrValue); } ///<summary> ///执行类方法 ///</summary> ///<paramname="methodName">方法名称</param> ///<paramname="paras">参数</param> ///<paramname="types">参数类型</param> ///<returns></returns> publicobjectGetMethod(stringmethodName,object[]paras,Type[]types) { //调用类型中的某个方法: MethodInfomethod=type.GetMethod(methodName,types); //通过方法名称获得方法 //执行方法 returnmethod.Invoke(obj,paras); } } }

上面这个类根据dll反射值,命名空间和类名,反射出一个具体的类,还提供了属性和方法的调用方法。很方便。

这些是我在研究插件编程时,顺带研究的,不太深入。

希望本文所述对大家的C#程序设计有所帮助。

您可能感兴趣的文章:c#动态加载dll文件,并实现调用其中的方法(推荐)C#中调用DLL时未能加载文件或程序集错误的处理方法(详解)C#中加载dll并调用其函数的实现方法Lua5.1中加载dll动态链接库的方法C#实现动态加载dll的方法windows服务器下IIS6/7下PHP无法加载php_curl.dll等动态链接库无法加载php_curl.dll解决办法DLL加载设置相对路径的方法

标签: 动态 系统 扩展 方法 dl dll

C++中用new创建二维数组和指针数组实例代码

Ubuntu配置sublime text 3的c编译环境的具体步骤

上述就是C#学习教程:C#动态加载dll扩展系统功能的方法分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/906360.html

(0)
上一篇 2021年10月23日
下一篇 2021年10月23日

精彩推荐