【问题标题】:How to manage run-time loaded dll versions?如何管理运行时加载的 dll 版本?
【发布时间】:2011-05-11 22:16:48
【问题描述】:

一点背景:

我有一个库项目 A,其中包含大量数据和一些托管 DLL。这个项目有自己的安装程序(由于它的大小),可以独立安装。

然后我有一些其他项目,当他们检测到项目 A 也已安装时,它们可以提供额外的功能。

设置: 我创建了一个 Interface.dll,其中包含由项目 A 实现的接口。所有其他项目都包含此 DLL,因此我可以在运行时加载项目 A 并将其转换为特定接口。

版本控制出现问题。有时某些项目将包含较新版本的 Interface.dll,而安装的项目 A 依赖于旧版本。发生这种情况时,我的演员表不再有效。

我正在考虑一些可能性:

  1. 放弃 interface.dll 并动态加载所有内容。
  2. 一些版本检测并通知用户更新他的项目A的版本。
  3. 使用其他通信方式(例如命令行)

【问题讨论】:

  • 为什么要更新interface.dll?你加了会员吗?改变现有成员?有什么不同?

标签: .net dll dynamic-loading


【解决方案1】:

大概在interfaces.dll中定义并由项目A实现的接口没有改变?也许其他项目刚刚添加了新接口。

您可能在这里遇到了一个普通的旧 .NET DLL 版本控制问题。项目 A (A.exe?) 是针对 interfaces.dll 版本 1.0.0.0 编译的,此信息存储在 A.exe 的元数据中。当您将interfaces.dll 更新为1.0.0.1 时,A.exe 无法加载它。如果新的 DLL 是向后兼容的(它确实必须是你的强制转换才能工作),那么你可以提供一个策略文件来告诉运行时加载器这种兼容性。例如:

<?xml version ="1.0"?>
<configuration>
<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
        <assemblyIdentity name="interfaces" culture="neutral" publicKeyToken="null"/>
        <bindingRedirect oldVersion="1.0.0.0-1.0.0.1" newVersion="1.0.0.1"/>
    </dependentAssembly>
    </assemblyBinding>
</runtime>
</configuration>

这告诉加载器,如果程序集试图加载 1.0.0.0 和 1.0.0.1 之间的任何版本的 interfaces.dll,那么版本 1.0.0.1 是可以接受的。以您的 DLL 命名此文件,使用标准模式:policy.1.0.interfaces.xml。然后把它和你的A.exe放在同一个目录下(我想)

或者,如果您没有更改 interfaces.dll 的版本号(您确实应该这样做),那么您可能会遇到不同的问题。如果您有两个标识相同但它们实际上不是相同的程序集的程序集,那么一旦运行时加载程序加载了其中一个程序集,它将永远不会加载第二个程序集。还有更多细节,但由于我认为这不太可能是您的问题,所以我现在不会深入讨论。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-27
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-04
    相关资源
    最近更新 更多