.net System.Management.Automation.dll版本控制混乱
我有一个“核心”程序集,其中包含一系列用C#编写的PowerShell cmdlet。我还有一个WPF“gui”应用程序,它使用这个“核心”程序集。为了使用和编译“核心”,我显然需要PowerShell的类型,因此我在我的项目中添加了对.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
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
不同,但它们具有相同的完整程序集名称。那么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