首页 新闻 会员 周边 捐助

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

0
悬赏园豆:100 [已解决问题] 解决于 2021-05-31 18:17

一,条件描述:

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

leslie_xin的主页 leslie_xin | 菜鸟二级 | 园豆:404
提问于:2021-05-29 16:43
< >
分享
最佳答案
1

在插件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, 主程序正常调用.
收获园豆:100
czd890 | 专家六级 |园豆:14488 | 2021-05-31 16:16

原来如此,那如何指定dll版本呢?

leslie_xin | 园豆:404 (菜鸟二级) | 2021-05-31 16:39

@leslie_xin:
原因大概就是上面说的这个, 解决有不同方式.

如果你的主程序和插件时一起编译的, 可以用dll别名来实现
还可以主程序create 一个新的appdomain来加载插件.

如果只能修改插件1, 那就参考

assembly.loadfrom("{plugin-1 dll path}/publicDll.v1.dll").gettype("").getmethod("").invoke("") 这么来调用.

实现方式主要还是取决于你的主程序是怎么做的.

czd890 | 园豆:14488 (专家六级) | 2021-05-31 18:15

@czd890: 好的,谢谢

leslie_xin | 园豆:404 (菜鸟二级) | 2021-05-31 18:17

@leslie_xin: 此问题已经解决。
相关教程:https://www.cnblogs.com/lesliexin/p/16280161.html
且,上面的附件已替换成解决后的源码。

leslie_xin | 园豆:404 (菜鸟二级) | 2022-05-19 13:53
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册