.net System.Management.Automation.dll版本控制混乱

.net System.Management.Automation.dll版本控制混乱,.net,powershell,assemblybinding,.net,Powershell,Assemblybinding,我有一个“核心”程序集,其中包含一系列用C#编写的PowerShell cmdlet。我还有一个WPF“gui”应用程序,它使用这个“核心”程序集。为了使用和编译“核心”,我显然需要PowerShell的类型,因此我在我的项目中添加了对System.Management.Automation.dll的引用。为此,我只需从本地计算机GAC添加对该DLL的引用。一切都在我的机器上顺利编译和运行 当我在不同的机器上部署和运行我的“gui”时,我会遇到奇怪的错误。例如: System.MissingMe

我有一个“核心”程序集,其中包含一系列用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()'
显然,在运行时找不到属性
PsInstance.Streams.Information

我发现作为项目参考添加的
System.Management.Automation.dll
不一定是加载的。框架首先查看GAC,如果在那里找到副本,它将使用该副本而不是我的副本

我知道问题的原因是,部署计算机安装了较旧版本的PowerShell,它没有实现我正在使用的属性,并引发上述异常

然而,我不明白的是:当这个程序集与我构建的程序集不兼容时,框架如何从GAC加载这个程序集

据我所知,框架使用AssemblyVersion、Name和PublicKeyToken来标识程序集

我的本地大会(工作):

服务器程序集(不工作):

这两个文件毫无疑问是不同的。但根据名称,它们是相同的。这样,框架将加载其中一个

为什么两个明显不同的文件(即使只看文件大小)具有相同的名称


我想补充一点,目标机器是Windows Server 2012R2,但这不是我注意到的唯一机器。我在新安装的Windows 7和另一台Windows 2012服务器上也注意到了这一点。

我最终在NuGet上使用了官方的Powershell参考组件包,从此过上了幸福的生活。我现在几乎总是使用
Microsoft.PowerShell.3.ReferenceAssemblies
。此后不再出现问题。

我最终在NuGet上使用了官方的Powershell参考组件包,从此过上了幸福的生活。我现在几乎总是使用
Microsoft.PowerShell.3.ReferenceAssemblies
。此后不再出现任何问题。

可能与此相关。文件版本为10的版本是PowerShell 5.0,其中添加了
信息流-服务器上的版本是4.0是的,我想是的。但真正的问题是:为什么来自PS5.0的程序集名称与来自PS4.0的程序集名称相同?这仅仅是因为微软有人决定将PowerShell作为就地更新而不是并排发布。对于.NETFramework4+也是如此mscorlib
与.NET Framework 4中的
mscorlib
不同,但它们具有相同的完整程序集名称。那么Windows Update呢?还有其他解决办法吗?还是没有任何可能性?可能相关。文件版本为10的版本是PowerShell 5.0,其中添加了
信息流
流-服务器上的版本是4.0是的,我想是的。但真正的问题是:为什么来自PS5.0的程序集名称与来自PS4.0的程序集名称相同?这仅仅是因为微软有人决定将PowerShell作为就地更新而不是并排发布。对于.NETFramework4+也是如此mscorlib与.NET Framework 4中的
mscorlib
不同,但它们具有相同的完整程序集名称。那么Windows Update呢?还有其他解决办法吗?还是没有任何可能性?
  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());
  };
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