2014-02-27 61 views
1

我有一個使用MEF加載插件的應用程序,它工作得很好。所有的插件引用核心庫並導出正確的部分,應用程序加載部分沒有任何問題。MEF中的Dll版本控制

出現的問題與插件庫的各個依賴關係有關。一個例子是Ionic.Zip和Newtonsoft.Json。由於在開發這些外部部件時使用了Nugget,因此不同的插件傾向於引用這些庫的不同版本。應用程序甚至可以加載它自己的(在Newtonsoft.Json的情況下)。

我意識到插件庫正在尋找這些庫的特定版本,因此在運行特定任務時會引發錯誤。

有沒有一種方法可以在開發過程中指出插件不應該綁定到任何特定版本的庫,以便它可以使用任何已加載的內容?

這樣,插入的Newtonsoft.Json或Ionic.Zip版本與哪個版本無關,它只會使用主應用程序加載的版本。

+0

你嘗試掛鉤到AppDomain.AssemblyResolve找到更多的信息,所有呼叫事件並使用Assembly.Load加載程序集 –

+0

不,我只是使用AggregateCatalog和AssemblyCatalog以及DirectoryCatalog從指定的文件夾加載插件。加載插件時不會發生錯誤。他們加載得很好。比方說一個庫使用不同版本的Ionic.Zip,它會正常加載,但當我實際調用一個使用Ionic.Zip的方法時會拋出異常。 – ritcoder

+0

你會得到哪些例外? 在我們的解決方案中,我們使用BindingRedirect來解決這些kindda問題。爲需要修復的程序集創建一個程序集綁定,並將所有版本(從0.0.0.0到最新版本)重定向到您擁有的版本。 –

回答

3

我相信你正在尋找組裝綁定重定向。

您可以通過在應用程序的app.config中添加條目來爲給定程序集創建程序集綁定重定向。以下示例將重定向到MyAssembly程序的任何版本做出大會v3.0.0.0

<configuration> 
    <runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <dependentAssembly> 
     <assemblyIdentity name="myAssembly" 
      publicKeyToken="32ab4ba45e0a69a1" 
      culture="en-us" /> 
     <!-- Assembly versions can be redirected in app, 
      publisher policy, or machine configuration files. --> 
     <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="3.0.0.0" /> 
     </dependentAssembly> 
    </assemblyBinding> 
    </runtime> 
</configuration> 

您可以在此鏈接 Redirecting Assembly Versions

+0

這應該在加載插件或插件本身的主應用程序內完成嗎? 如何對主應用程序不知道的庫,但通過插件引用依賴關係(例如,插件1引用NLog vX.Y和插件2引用vX.Z?我觀察到的是,因爲我們只是複製插件,所以我們結束只有一個庫的副本,具體取決於哪一個最後被複制 – ritcoder

+0

加載插件的主要應用程序(基本上是exe.config) 您可以嘗試保留所有相關程序集的最新版本一個lib文件夾並將它們全部複製到目標文件夾中 –

+0

這很有意思,所以它意味着主應用程序應該知道所有相關的庫,我會試一試 – ritcoder