2015-10-05 104 views
13

我使用​​庫以利用被定義有PowerShell的類和接口的寫程序參考。這些庫有兩個版本:1.0.0.0和3.0.0.0。 Windows Server 2008的GAC版本爲1.0,而Windows Server 2012的GAC版本爲1.0和3.0。跨平臺系統庫PowerShell和服務器管理器模塊

爲了能夠在VS的項目中使用這個庫,我要引用它。現在這是一個決定,我應該參考哪一個?那麼,因爲兩臺服務器在其GAC中都有1.0,所以參考1.0版應該是安全的。不過,爲了以防萬一,如果在GAC中不存在一些罕見(或常見)情況,我會將其複製到本地。使用這個庫的

示例代碼:

using (PowerShell PS = PowerShell.Create()) 
{ 

    PS.AddScript("Import-Module ServerManager") 
     .Invoke(); 
} 

Import-Module Servermanager命令原因的powershell導入另一個DLL,Microsoft.Windows.ServerManager。問題開始。

Windows Server 2008的只有這個圖書館,Windows Server 2012中有版本6.3.0.0 6.1.0.0的版本。我假設Automation的1.0到6.1和3.0到6.3版本的相似度不是巧合。

當我在Windows Server 2008上使用我的程序時,它工作正常,但是當我嘗試在Windows Server 2012上使用它時,此自動化1.0程序集試圖加載ServerManager程序集版本6.1(!),沒有。 2012年會傾向於使用Automation assembly v3.0並加載ServerManager v6.3。

我假設有某種方式「告訴」程序加載程序集X,如果服務器版本Y和裝配a。如果服務器版本B的,但它在哪裏去了?我怎麼能確定,我不會遇到一些服務器,將有2.0或4.0版本或其他什麼。

問題是,我不能引用(本地複製)ServerManager程序集,因爲(我認爲),只要我能「告訴」我的程序它應該在哪裏尋找程序集,我不能告訴自動化裝配在哪裏尋找其他裝配。通過使用procmon進行分析,我可以看到它完全知道在哪裏尋找,因爲它立即導航到C:\Windows\System32\WindowsPowerShell\v1.0\Modules\ServerManager以查找ServerManager程序集。

可能的解決辦法,我知道有:

  1. 我可以嘗試動態加載的程序集,而無需使用Assembly.Load()dynamic對象,其使用參考他們在視覺studion,有人建議,我應該燒火熱的地獄(我認爲那個人提到它極易出錯)。

  2. 我可以將我需要的程序集添加到GAC中,但這可能會導致一些依賴性地獄,因爲Automation和ServerManager都可能有很多其他依賴項,而我現在只發現其中的兩個。

我還有哪些其他選擇?

回答

0

你試過集重定向在您的config文件對那些引用?

<runtime> 
 
    <assemblyBinding appliesTo="v2.0.50727" xmlns="urn:schemas-microsoft-com:asm.v1"> 
 
     <dependentAssembly> 
 
     <assemblyIdentity name="System.Web.Extensions" publicKeyToken="31bf3856ad364e35"/> 
 
     <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="3.5.0.0"/> 
 
     </dependentAssembly> 
 
     <dependentAssembly> 
 
     <assemblyIdentity name="System.Web.Extensions.Design" publicKeyToken="31bf3856ad364e35"/> 
 
     <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="3.5.0.0"/> 
 
     </dependentAssembly> 
 
    </assemblyBinding> 
 
    </runtime>