我使用庫以利用被定義有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程序集。
可能的解決辦法,我知道有:
我可以嘗試動態加載的程序集,而無需使用
Assembly.Load()
和dynamic
對象,其使用參考他們在視覺studion,有人建議,我應該燒火熱的地獄(我認爲那個人提到它極易出錯)。我可以將我需要的程序集添加到GAC中,但這可能會導致一些依賴性地獄,因爲Automation和ServerManager都可能有很多其他依賴項,而我現在只發現其中的兩個。
我還有哪些其他選擇?