C# MEF 公共DLL版本不同、方法变化,导致的问题

一,条件描述:

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,解决办法或思路。

四,源代码下载

https://files.cnblogs.com/files/lesliexin/MefDemo.zip

回答

在插件1里面没有特别指定publicDll.dll的版本信息(包括dll路径,版本号,强签名等)的时候, 默认AssemblyLoader 会优先从主程序目录下加载这个Dll, 也就是你的v2版本.

假如你的程序目录结构

  • bin
    • main.exe
    • plugin-1
      • plugin-1.main.dll # 插件内要指定用 bin/plugin-1/publicDll.v1.dll
      • publicDll.v1.dll
    • plugin-2
      • plugin-2.main.dll

在使用同一个dll的多个版本的时候,切记它们的任何对象都不是相同的. 比如:

// 主程序
Plugins.Method(new PublicDll.V2.MyCalss())
//插件1
void Method(MyCalss class) //在插件1指定使用了v1版本的PublicDll的时候, 主程序调用会报对象不能转换.
//插件2
void Method(MyCalss class) //插件2默认使用v2的PublicDll, 主程序正常调用.
以上是C# MEF 公共DLL版本不同、方法变化,导致的问题的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>