.Net 不同版本的.Net框架的代码之间互相引用

本文介绍在高版本.NET框架下,如何调用低版本框架编写的DLL,特别是当DLL依赖于特定版本的数据库引擎时。通过修改Config配置文件,使用Assembly.Load方法和反射,实现不同版本间的调用。

有时候想用高版本的.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类型的值

参考文献:

  • 微软手册 -> Configuration节点内的详细信息和注释

  • 微软手册 -> 用Assembly.Load调用长名称的程序集  -> 程序集名称的长格式包含其简单名称 (如 System .dll 程序集的 "System") 及其版本、区域性、公钥标记, 还可以是其处理器体系结构 

  • 优快云 -> .Net dll多个同名的程序集版本冲突共存与通过基本代码或探测定位程序集方案

  • 博客 -> 如何创建强命名程序集, 如何查看强命名程序集的PublicKeyToken

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

这个月太忙没时间看C++

你的鼓励将是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值