2013-01-10 46 views
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) 

我知道如果我添加的所有插件的安裝程序我能避免這個錯誤,但如果我以後再添加一個新的插件,用戶將不得不卸載並重新安裝。動態加載插件的原因是,用戶可以放下一個新插件,並且它可以工作。

有沒有辦法讓插件在主應用程序中引用對象而不用擔心應用程序的版本?

謝謝。

+0

這是非常經典的DLL地獄,該插件有一個相關的程序集,但CLR發現一個版本號錯誤。您可能不得不重新考慮「將文件夾放入文件夾」的方法。 –

回答

2

如果更改僅在插件程序集版本中更改,您可以使用runtime binding redirect更改的程序集。

<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文件)提供更新。 (不需要安裝/卸載)。

+0

我的擔心是,主要的應用程序可能是v.1.0,而插件a是版本1.1和插件b是1.2。另一個人可能正在運行第2版的應用程序,但使用相同的兩個插件。我希望有一種方法可以使插件版本的動態加載獨立。我認爲一個接口可以工作,但插件仍然需要引用主程序集來訪問它。 – Tim

+0

您可以使用反射,不需要參考。這是使用插件的要點。如果需要引用,它將不會被命名爲插件 – Tilak

1

通常的做法是製作具有明確版本(只有在接口更改時才更改)的特殊「公共接口」程序集,並將插件和主應用程序鏈接到該程序集。您仍然需要爲此類彙編提供向後兼容性並使用綁定重定向(即按照Tilak的+1回答中所示進行配置)。

相關問題