C#动态dll系统问题

Posted

技术标签:

【中文标题】C#动态dll系统问题【英文标题】:C# Dynamic dll system problem 【发布时间】:2009-06-10 14:56:15 【问题描述】:

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

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

-详情:

我尝试通过“Assembly”加载 dll dll = Assembly.LoadFile(" 并通过 "汇编 dll=domaindll.Load(" 在 Functions.dll 中,所有方法和对象都是静态的 我通过 VS 引用 Functions.dll 来“静态”使用它 非动态案例 dll 和 Functions.dll 也是用 C# 开发的

-文件夹结构:

应用:

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)

【问题讨论】:

【参考方案1】:

您可以通过强签名强制绑定到特定版本的 DLL。您也可以尝试在引用属性上将“特定版本”设置为 true,但据我所知,这只会影响编译时绑定,如果程序集不是强签名的,则可以在运行时加载不同的版本。

这应该可以帮助您入门:Strong-Name Signing for Managed Applications

但请注意,在此 dll 中声明的任何类型都不会与不同版本程序集中的相同类型进行类型等效。例如,如果我在Functions.dll 中声明了一个名为Foo 的类,那么来自版本1.0 的Foo 的实例将与来自版本1.1 的Foo 的实例类型不同。就 CLR 而言,它们是完全不同的类型。

如果您只有程序集中的静态函数并且没有定义任何类型,那么您应该没问题。否则,您需要研究一种不同的方法。

【讨论】:

它是一个很好的解决方案...但我无法签署 Functions.dll 因为当我在测试中使用签名的 Fuctions.dll 时(将其静态引用到项目)它会在每种方法中产生随机错误的dll。 (这不会发生在未签名的情况下)示例:匹配 -'Funciones.FunSAP.comboboxvaciar(SAPbouiCOM.ComboBox)' 的最佳重载方法有一些无效参数 -'x.Application' 不包含 'Formx' 的定义和找不到接受“x.Application”类型的第一个参数的扩展方法“Formx”(您是否缺少 using 指令或程序集引用?) 也许您应该编辑您的问题并发布一个实际的代码示例。这可能会使问题更加明显。【参考方案2】:

为了能够做到这一点,我认为您必须将(示例)DLL 加载到单独的 AppDomain 中。进行跨 AppDomain 调用会导致一些性能损失,但这在您强调的场景中是不可避免的。

【讨论】:

问题是这与开发/调试项目不兼容(请参阅我的另一个问题:“C# dll 版本冲突”)所以我没有测试过这个解决方案......我不知道它是否会为特定问题工作(使用appdomains对于能够动态卸载dll也很有用......)如果我有时间测试它,我会将结果发布给其他人知道......(我找到了一个很好的参考尽可能测试它.. experts-exchange.com/Programming/Languages/C_Sharp/…) 在单个应用程序域中,我认为您不能加载同一个库的多个不同版本,除非可能通过签名使其具有强身份。【参考方案3】:

最后我解决了它重命名 Functions.dll 以匹配使用它的EXAMPLEDLL....例如:Application.EXE-->FunctionsApplication.dllEXAMPLEDLL1.dll-->FunctionsEXAMPLEDLL1.dll 无论如何感谢您的回答..

Postdata:在另一种我可以正确签署 dll 的情况下,我认为 Adam Robinson 的答案是正确的(而 jerryjvl 是第二个回答者)。

【讨论】:

以上是关于C#动态dll系统问题的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio中根据系统区分引用64位32位DLL动态库文件的配置方法

C#如何静态调用C++中的方法(静态调用dll)

C# AppDomain 无法加载 DLL

C#插件系统设计

C# PInvoking user32.dll 在 64 位系统上

vs2010 C# 添加 DLL引用