我有一个可以动态运行几个插件的应用程序。在安装完应用程序后,用户只需将适当的插件放入安装目录中,程序将根据一个接口动态加载它们。
我遇到的问题是,插件在主应用程序中引用一个库来访问正确的接口并共享全局设置。我希望能够随时添加插件,而无需用户重新安装。然而,由于插件引用了一个库,当我试图加载它们时,我得到了错误:
Could not load file or assembly 'program', Version=0.1.0.24838, Culture=neutral, PublicKeyToken=623917...' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)
我知道如果我将所有插件添加到安装程序中,我可以避免此错误,但如果我稍后添加新插件,用户将不得不卸载并重新安装。动态加载插件的原因是,这样用户就可以直接插入一个新的插件,它就可以工作了。
是否有一种方法可以让插件在主应用程序中引用对象而不用担心应用程序的版本?
谢谢。
如果只在插件程序集版本中更改,则可以使用运行时绑定重定向。
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="myAssembly"
publicKeyToken="32ab4ba45e0a69a1"
culture="neutral" />
<bindingRedirect oldVersion="1.0.0.0"
newVersion="2.0.0.0"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
您可以通过单独的补丁(zip文件)提供更新。(无需安装/卸载)
常见的方法是制作特殊的"公共接口"程序集,该程序集具有显式版本(仅在接口更改时更改),并将插件和主应用程序链接到该程序集。您仍然需要为这样的程序集提供向后兼容性,并使用绑定重定向(即按照Tilak的+1答案进行配置)。