0

一点背景:

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

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

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

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

我正在考虑一些可能性:

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

1 回答 1

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

于 2011-05-11T22:38:32.003 回答