2

我有一个应用程序使用插件模型在运行时加载程序集的情况。大多数这些程序集对随时间修改的公共程序集有进一步的依赖性。

例如,插件 A 依赖于版本 1 的 Common,插件 B 依赖于版本 2 的 Common。

插件是自包含的,并且公共程序集是强命名的,因此在纯托管环境中加载了不同的 Common 程序集,并且在来自不同 Common 版本的类型之间没有意外转换的危险,并且一切正常。

当从混合模式程序集加载时,这是一个要求,我们处于第一个加载的程序集“获胜”的情况。因此,在示例中,插件 B 将尝试加载 Common v1,在我们的例子中,由于旧版本的程序集中缺少一些类型,因此会引发 TypeLoadException。

我们如何强制 C++/CLI 环境遵守插件中引用的验证?

我们尝试过:

  1. /FU 编译器选项针对适当的版本

  2. #针对适当的版本使用

  3. .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。

4

1 回答 1

0

混合模式程序集包含一个本机部分,您不能将此本机部分的多个副本加载到单个进程中。

混合模式程序集也不能很好地与 AppDomains 配合使用,因为本机部分是进程范围的。

重命名其中一个版本可能会有一些运气,因为这就是 Windows 跟踪本机 DLL 的方式。

于 2012-04-12T18:21:17.507 回答