我遇到一种情况,即应用程序使用插件模型在运行时加载程序集。大多数这些程序集都依赖于随时间修改的公共程序集。
例如,插件A取决于Common的版本1,而插件B取决于Common的版本2.
插件是自包含的,并且通用程序集具有强名称,因此在纯托管环境中,不同的Common程序集会被加载,并且不存在来自不同Common版本的类型之间意外转换的危险,并且一切正常。
从混合模式程序集加载时,这是一个要求,我们处于第一个加载的程序集“获胜”的情况。所以在这个例子中,插件B将尝试加载Common v1,在我们的例子中抛出一个TypeLoadException,因为旧版本的程序集中缺少某些类型。
我们如何强制C ++ / CLI环境来尊重插件中的引用?
我们尝试过:
/针对相应版本的FU编译器选项
针对相应版本的#using
.NET参考对话框中使用强名称组件的特定版本引用。
这些都不能有效地引用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。
答案 0 :(得分:0)
混合模式程序集包含本机部分,您无法将此本机部分的多个副本加载到单个进程中。
混合模式程序集也不能很好地与AppDomains一起使用,因为本机部分是整个流程的。
您可能会对重命名其中一个版本感到幸运,因为这是Windows跟踪本机DLL的方式。