为什么在混合模式程序集中不支持强版本?

时间:2012-04-12 17:50:45

标签: .net c++-cli clr

我遇到一种情况,即应用程序使用插件模型在运行时加载程序集。大多数这些程序集都依赖于随时间修改的公共程序集。

例如,插件A取决于Common的版本1,而插件B取决于Common的版本2.

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

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

我们如何强制C ++ / CLI环境来尊重插件中的引用?

我们尝试过:

  1. /针对相应版本的FU编译器选项

  2. 针对相应版本的#using

  3. .NET参考对话框中使用强名称组件的特定版本引用。

  4. 这些都不能有效地引用V2组件。

    更新:这里有关于系统的更多细节,它很敏感所以我会坚持使用上面的A / B语言。

    CommonAssembly.dll v1和v2(C#)强名称

    PluginA:使用/ clr编译的C ++ / CLI,使用/ FU编译器选项引用的CommonAssembly v1

    PluginB:使用/ clr编译的C ++ / CLI,使用/ FU编译器选项引用的CommonAssembly v2

    主要应用程序:Unmanaged - 在运行时加载PluginA和PluginB,没有直接引用。

    非托管应用程序加载PluginA,它会加载CommonAssembly v1。然后,应用程序尝试加载需要CommonAssembly v2的PluginB。 CLR尝试使用v1代替,并且存在TypeLoadException。

1 个答案:

答案 0 :(得分:0)

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

混合模式程序集也不能很好地与AppDomains一起使用,因为本机部分是整个流程的。

您可能会对重命名其中一个版本感到幸运,因为这是Windows跟踪本机DLL的方式。