1

我有一个可以动态运行多个插件的应用程序。安装应用程序后,用户只需将相应的插件放入安装目录,程序将根据界面动态加载它们。

我遇到的问题是插件引用了主应用程序中的一个库来访问正确的界面并共享全局设置。我希望能够随时添加插件,而无需用户重新安装。但是,由于插件引用了一个库,所以当我尝试加载它们时,我收到了错误:

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)

我知道如果我将所有插件添加到安装程序中,我可以避免这个错误,但如果我稍后添加新插件,用​​户将不得不卸载并重新安装。动态加载插件的原因是用户只需放入一个新插件,它就可以工作。

有没有办法让插件引用主应用程序中的对象而不用担心应用程序的版本?

谢谢。

4

2 回答 2

2

如果更改仅在插件程序集版本中,您可以对已更改的程序集使用运行时绑定重定向。

<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 文件)提供更新。(无需安装/卸载)。

于 2013-01-10T19:39:35.697 回答
1

常见的方法是制作具有显式版本的特殊“公共接口”程序集(仅在接口更改时更改)并将插件和主应用程序链接到该程序集。您仍然需要为此类程序集提供向后兼容性并使用绑定重定向(即如 Tilak 的 +1 答案所示配置)。

于 2013-01-10T19:41:48.297 回答