簡體   English   中英

System.Management.Automation.dll 版本混淆

[英]System.Management.Automation.dll versioning confusion

我有一個“核心”程序集,其中包含一系列用 C# 編寫的 PowerShell Cmdlet。 我還有一個使用這個“核心”程序集的 WPF“gui”應用程序。 為了使用和編譯“核心”,我顯然需要 PowerShell 的類型,因此我在我的項目中添加了對System.Management.Automation.dll的引用。 我通過簡單地從我的本地機器 GAC 添加對該 DLL 的引用來做到這一點。 一切都在我的機器上編譯並順利運行。

當我在另一台機器上部署和運行我的“gui”時,出現奇怪的錯誤。 例如:

System.MissingMethodException: Method not found: 'System.Management.Automation.PSDataCollection`1<System.Management.Automation.InformationRecord> System.Management.Automation.PSDataStreams.get_Information()'

我已將原因縮小到這一點:我的“gui”實現了一個自定義 PowerShell 主機並加載“核心”並執行它的 cmdlet。 它是這樣完成的:

  Host = new MyCustomHost();
  var rs = RunspaceFactory.CreateRunspace(Host);
  PsInstance = PowerShell.Create();

  PsInstance.Runspace = rs;
  rs.Open();

  PsInstance.Streams.Information.DataAdded += delegate (object s, DataAddedEventArgs e)
  {
    nvtLogger.WriteInformation(PsInstance.Streams.Information[e.Index].MessageData.ToString());
  };

顯然,在運行時找不到屬性PsInstance.Streams.Information

我發現作為項目引用添加的System.Management.Automation.dll不一定是加載的那個。 該框架首先查看 GAC,如果在那里找到副本,它會使用該副本而不是我的副本。

我知道問題的原因是部署機器安裝了舊版本的 PowerShell,它沒有實現我正在使用的屬性 - 並拋出上述異常。

然而,我不明白的是:當它與我構建的程序集不兼容時,框架如何從 GAC 加載這個程序集?

據我所知,該框架使用 AssemblyVersion、Name 和 PublicKeyToken 來標識程序集。

我的本地程序集(工作):

Assembly Location: C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Management.Automation\v4.0_3.0.0.0__31bf3856ad364e35\System.Management.Automation.dll
Assembly Fullname: System.Management.Automation, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
File ProductVersion: 10.0.14393.1532
File Size: 7,1MB

服務器組件(不工作):

Assembly Location: C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Management.Automation\v4.0_3.0.0.0__31bf3856ad364e35\System.Management.Automation.dll
Assembly Fullname: System.Management.Automation, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
File ProductVersion: 6.3.9600.18728
File Size: 5,8MB

這兩個文件無疑是不同的。 但根據 AssemblyName,它們是相同的。 這樣框架將加載一個或另一個。

兩個明顯不同的文件(即使僅查看文件的大小)怎么可能具有相同的 AssemblyName?

我想補充一點,目標機器是 Windows Server 2012R2,但它並不是我注意到這一點的唯一機器。 我還在新安裝的 Windows 7 和另一個 Windows 2012 服務器上注意到了它。

我最終在 NuGet 上使用了官方的 Powershell 參考組件包,從此過上了幸福的生活。 盡可能地保持兼容我現在幾乎總是使用Microsoft.PowerShell.3.ReferenceAssemblies 從那以后就沒有問題了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM