一些背景知识:
我有一个库项目A,它包含大量数据和一些托管DLL。该项目有自己的安装程序(由于其大小),可以单独安装。
然后我还有一些其他项目可以在检测到项目A也已安装时提供额外的功能。
设定: 我创建了一个Interface.dll,其中包含由项目A实现的接口。所有其他项目都包含此DLL,因此我可以在运行时加载项目A并将其转换为特定的接口。
版本控制会出现问题。有时一些项目将包含较新版本的Interface.dll,而安装项目A依赖于较旧版本。当发生这种情况时,我的演员阵营不再有效。
我正在考虑一些可能性:
答案 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的版本号(您确实应该这样做),那么您可能会遇到其他问题。如果你有两个程序集的标识相同但它们实际上不是相同的程序集,那么一旦运行时加载程序加载了其中一个程序集,它就永远不会加载第二个程序集。还有更多细节,但由于我认为这不太可能是你的问题,我现在不会进入它们。