如何管理运行时加载的DLL版本?

时间:2011-05-11 22:16:49

标签: .net dll dynamic-loading

一些背景知识:

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

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

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

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

我正在考虑一些可能性:

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

1 个答案:

答案 0 :(得分:2)

大概是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的版本号(您确实应该这样做),那么您可能会遇到其他问题。如果你有两个程序集的标识相同但它们实际上不是相同的程序集,那么一旦运行时加载程序加载了其中一个程序集,它就永远不会加载第二个程序集。还有更多细节,但由于我认为这不太可能是你的问题,我现在不会进入它们。