有时候想用高版本的.Net框架,而某一部分封装好的工具类是低版本的
例: 使用.Net 4.7.2写的主程序,需要引用.Net 4.5.2写的数据库帮助类,因为数据库帮助类已经引用了对应4.5版本的Mysql.dll或其他的数据库引擎提供的dll,不方便更改帮助类的框架
就可以使用这个方法对.Net 4.5.2的数据库帮助类进行调用
Config配置文件里:
<Configuration>
<!--这里应该会有一行默认的SupportedRuntime-->
<!--在下面新增-->
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <!--这一句暂时不知道什么意思,按照手册说明这一句是必要的-->
<dependentAssembly>
<!--需要跨版本调用的所有程序集都需要被签名,且需要同一个签名文件,既:他们的token必须要一样-->
<assemblyIdentity name="你需要跨版本调用的Dll的命名空间名称" publicKeyToken="程序集签名的token"/> <!-- 封装程序集的绑定策略和程序集位置。 使用一个 <dependentAssembly > 标记每个程序集。-->
<bindingRedirect oldVersion="0.0.0.0" newVersion="1.0.0.0"/> <!-- 将一个程序集版本重定向到另一个版本。--> <!--非必须-->
<!--codeBase标签在一个dependentAssembly内可以存在多个-->
<codeBase version="你需要跨版本调用的代码中Assembly的版本" href="你需要跨版本调用的dll对应版本号的文件所存在的路劲"/><!-- 指定公共语言运行时在哪里可以找到程序集。-->
</dependentAssembly>
</assemblyBinding>
</runtime>
</Configuration>
调用时:
Assembly ass = Assembly.Load("要调用的程序集的命名空间名称,那个程序集Assembly里的版本号,Culture=neutral,根据签名计算出来的token"); // 反射加载出程序集 Assembly里的版本对应Configuration里CodeBase的Version
T instance = (T) ass.CreateInstance(程序集命名空间.类名); //创建实例 静态类参考静态类反射调用的方法创建实例
MethodInfo method = instance.GetType().GetMethod(要调用的方法名); //反射获取到方法信息,准备调用
object o = method.Invoke(该方法所处类的实例,该方法所需要的参数信息); //调用方法,返回object类型的值
参考文献:
本文介绍在高版本.NET框架下,如何调用低版本框架编写的DLL,特别是当DLL依赖于特定版本的数据库引擎时。通过修改Config配置文件,使用Assembly.Load方法和反射,实现不同版本间的调用。
1265

被折叠的 条评论
为什么被折叠?



