1,语言:C#
2,MEF框架
3,主程序、插件1、插件2都引用了相同的公共dll:PublicDll.dll,并使用了公共dll的方法:Test()。
4,PublicDll有两个版本,v1.0版的方法为:Test(string str)。v2.0版的方法为:Test(string str,int i)。
5,主程序使用的是:v2.0版PublicDll.dll。
6,插件1使用的是:v1.0版PublicDll.dll。
7,插件2使用的是:v2.0版PublicDll.dll。
8,相关代码在下方有源工程。
1,主程序运行正常,插件2调用正常。
2,插件1调用失败,提示,找不到方法:Test(string str)。
1,问题产生原因。正常来说每个插件都在不同的文件夹中,应该不会发生冲突。
2,解决办法或思路。
在插件1里面没有特别指定publicDll.dll的版本信息(包括dll路径,版本号,强签名等)的时候, 默认AssemblyLoader 会优先从主程序目录下加载这个Dll, 也就是你的v2版本.
假如你的程序目录结构
bin/plugin-1/publicDll.v1.dll
在使用同一个dll的多个版本的时候,切记它们的任何对象都不是相同的. 比如:
// 主程序
Plugins.Method(new PublicDll.V2.MyCalss())
//插件1
void Method(MyCalss class) //在插件1指定使用了v1版本的PublicDll的时候, 主程序调用会报对象不能转换.
//插件2
void Method(MyCalss class) //插件2默认使用v2的PublicDll, 主程序正常调用.
原来如此,那如何指定dll版本呢?
@leslie_xin:
原因大概就是上面说的这个, 解决有不同方式.
如果你的主程序和插件时一起编译的, 可以用dll别名来实现
还可以主程序create 一个新的appdomain来加载插件.
如果只能修改插件1, 那就参考
assembly.loadfrom("{plugin-1 dll path}/publicDll.v1.dll").gettype("").getmethod("").invoke("") 这么来调用.
实现方式主要还是取决于你的主程序是怎么做的.
@czd890: 好的,谢谢
@leslie_xin: 此问题已经解决。
相关教程:https://www.cnblogs.com/lesliexin/p/16280161.html
且,上面的附件已替换成解决后的源码。