直到今天,蓝色药丸让我很高兴地忽略了一个有趣的点。但 James Truher(微软 PowerShell 团队)最近发布的一篇文章将其换成了红色药丸。这导致了这个思路......
上周之前,用 C# 编写 cmdlet 需要从任何可以找到的地方挖掘System.Management.Automation.dll
的副本(或者,如果对 PowerShell v3 特别满意,则从
C:\Program Files (x86)\Reference Assemblies\Microsoft\WindowsPowerShell\3.0
中 VS2013 安装的 V3 参考程序集中挖掘。无论哪种方式,它远不如 nuget 提供的那样健壮地维护与该 DLL 的连接。但是现在,正如 Truher 所宣布的那样,PowerShell 参考程序集可以通过 nuget 获得
万岁!除了 Microsoft 不仅为 V3 提供了参考程序集,还为 PowerShell V3、V4 和 V5 提供了参考程序集。 我想知道的是:对于应一起使用哪个版本的 PowerShell 引用程序集与哪个版本的 .NET 框架是否存在限制?还是简单地说,如果我想要运行自定义 C# cmdlet 的系统安装了 PowerShell 版本 x
,那么我只需在开发中使用参考程序集版本x?
还有一点我需要在更广泛的背景下澄清:目前我有一个从 GAC 引用 System.Management.Automation.dll
CopyLocal
设置为 false,因此它会在运行时使用 GAC 中的 DLL。与从 nuget 下载参考程序集的私有副本并将其保存在我的解决方案中相比,这不是更好吗?
不幸的是,关于用 C# 编写 cmdlet 的信息并不是特别丰富。简短的回答是:您可以使用参考程序集,而不必担心 .NET 版本。
事实证明,直接引用
System.Management.Automation.dll
将会产生负面后果。我第一次这样做是因为我不明白正确的 NuGet 包在哪里,结果是它在任何其他机器上都崩溃了。
并且它允许您在不涉及 PowerShell 运行时的情况下使用您的库!也就是说,您可以使用 C# cmdlet,就像它们只是常规 C# 库一样。这是最推荐的选项,但单元测试仍然需要特定版本的 .NET 来执行。 PSCmdlets
的任何单元测试仍然需要实际的参考程序集来执行。