我有一个动态加载dll的应用程序。应用程序和 dll使用Functions.dll,它可以是应用程序的不同版本 对于每个dll,但在执行时,应用程序和dll都使用相同的 dll版本(EXE使用的版本)并共享静态变量......
我如何强迫他们使用自己的Functions.dll(n-version)?
-details:
-Folder Estructure:
应用:
Application.EXE
Functions.dll(version 1.2)
DLLS:
EXAMPLEDLL1:
EXAMPLEDLL1.DLL
Functions.dll(version 1.1)
EXAMPLEDLL2:
EXAMPLEDLL2.DLL
Functions.dll(version 1.0)
EXAMPLEDLL3:
EXAMPLEDLL3.DLL
Functions.dll(version 1.2)
答案 0 :(得分:4)
您可以通过对其进行强签名来强制绑定到特定版本的DLL。您还可以尝试在引用属性上将“特定版本”设置为true,但据我所知,只有影响编译时绑定,并且如果程序集没有强签名,则可以在运行时加载不同的版本。
这应该让你开始:Strong-Name Signing for Managed Applications
请注意,在此dll中声明的任何类型都不会在不同版本的程序集中与类型相同。例如,如果我在Foo
中声明了一个名为Functions.dll
的类,则版本1.0中的Foo
实例与Foo
的实例的类型不同版本1.1。就CLR而言,这些是完全不同的类型。
如果你所拥有的只是程序集中的静态函数而没有定义类型,那么你应该没问题。否则你需要研究一种不同的方法。
答案 1 :(得分:0)
为了能够做到这一点,我认为你必须将你的(示例)DLL加载到单独的AppDomain中。进行跨AppDomain调用会产生一些性能损失,但在您突出显示的场景中这是不可避免的。
答案 2 :(得分:0)
最后我解决了它重命名Functions.dll以匹配使用它的EXAMPLEDLL ....例如:Application.EXE - > FunctionsApplication.dll EXAMPLEDLL1.dll - > FunctionsEXAMPLEDLL1.dll感谢无论如何答案..
Postdata:在另一个我可以正确签署dll的情况下,我认为Adam Robinson的答案是正确的(而jerryjvl是第二个anwser)。