C#动态DLL系统问题

时间:2009-06-10 14:56:16

标签: c# dll dynamic assemblies load

我有一个动态加载dll的应用程序。应用程序和 dll使用Functions.dll,它可以是应用程序的不同版本 对于每个dll,但在执行时,应用程序和dll都使用相同的 dll版本(EXE使用的版本)并共享静态变量......

我如何强迫他们使用自己的Functions.dll(n-version)?

-details:

  • 我尝试用“装配”加载dll dll = Assembly.LoadFile(“和by “Assembly dll = domaindll.Load(”
  • 在Functions.dll中,方法和对象是静态
  • 我通过VS引用它来“静态地”使用Functions.dll 不动态的案例
  • dlls和Functions.dll也是用C#开发的

-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)

3 个答案:

答案 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)。