我有一个应用程序使用插件模型在运行时加载程序集的情况。大多数这些程序集对随时间修改的公共程序集有进一步的依赖性。
例如,插件 A 依赖于版本 1 的 Common,插件 B 依赖于版本 2 的 Common。
插件是自包含的,并且公共程序集是强命名的,因此在纯托管环境中加载了不同的 Common 程序集,并且在来自不同 Common 版本的类型之间没有意外转换的危险,并且一切正常。
当从混合模式程序集加载时,这是一个要求,我们处于第一个加载的程序集“获胜”的情况。因此,在示例中,插件 B 将尝试加载 Common v1,在我们的例子中,由于旧版本的程序集中缺少一些类型,因此会引发 TypeLoadException。
我们如何强制 C++/CLI 环境遵守插件中引用的验证?
我们尝试过:
/FU 编译器选项针对适当的版本
#针对适当的版本使用
.NET 参考对话框中使用强命名组件的特定版本参考。
这些都不能有效地让 V2 程序集被引用。
更新:这里有更多关于系统的细节,它很敏感,所以我会坚持上面的 A/B 语言。
CommonAssembly.dll v1 和 v2 (C#) 强命名
PluginA:使用 /clr 编译的 C++/CLI,使用 /FU 编译器选项引用的 CommonAssembly v1
PluginB:使用 /clr 编译的 C++/CLI,使用 /FU 编译器选项引用的 CommonAssembly v2
主应用程序:非托管——在运行时加载 PluginA 和 PluginB,没有直接引用。
非托管应用程序加载 PluginA,后者加载 CommonAssembly v1。然后应用程序尝试加载需要 CommonAssembly v2 的 PluginB。CLR 尝试改用 v1,但出现 TypeLoadException。