
如何构建同时兼容 PowerShell Core 与 Windows PowerShell 的 .NET Standard 2.0 二进制模块【免费下载链接】PowerShellPowerShell for every system!项目地址: https://gitcode.com/GitHub_Trending/po/PowerShell如果你的目标是只构建一份 DLL同时让它在 PowerShell Core跨操作系统和 Windows PowerShell 3 及以上版本中都能导入运行做法是把二进制模块做成 .NET Standard 2.0 类库。PowerShell 官方仓库的 命令行示例文档 完整演示了这条路径用 .NET Core 命令行工具创建项目、添加PowerShellStandard.Library包、构建并导入验证还说明了 Windows PowerShell 一侧的兼容性边界和netstandard.dll缺失时的处理方法。本文按该文档的操作顺序展开。准备条件文档明确列出两项前置要求PowerShell Core 和/或 Windows PowerShell。开发环境可以用 PowerShell Core 支持的任意操作系统。若不确定自己的系统是否支持查看仓库 README.md 的 Get PowerShell 部分。.NET Core 2.x SDK。在 Linux 上建议使用包管理器安装 SDK并按自己使用的发行版RHEL、Debian 等选择对应说明。一个附加说明在 Windows 10 Anniversary Update 或更高版本上可以用 WSLWindows Subsystem for Linux控制台来构建模块但要在 WSL 中导入并使用该模块还需要为当前 Linux 发行版和版本安装对应的 PowerShell Core可以在 WSL 中运行lsb_release -a查看发行版信息。装完 SDK 后先验证dotnetCLI 版本dotnet --version文档要求输出2.0.0或更高。如果返回的主版本号是 1说明 .NET Core 2.x SDK 未生效需要重新安装 SDK 并重启 shell 后才能用上新版工具。创建 .NET Standard 2.0 类库项目以下命令在主目录任意工作目录执行MyModule是文档示例中使用的模块名可以按需替换为其他名称。用dotnetCLI 创建 classlib 项目classlib 项目默认基于 .NET Standard 2.0dotnet new classlib --name MyModule进入项目目录并添加global.json锁定项目使用2.0.0版本的 .NET Core SDK。文档说明这一步是必要的用于避免机器上同时安装了多个 .NET Core SDK 版本时出问题cd MyModule dotnet new globaljson --sdk-version 2.0.0添加 PowerShell Standard Library 包PowerShellStandard.Library。这个包提供System.Management.Automation程序集是 C# cmdlet 依赖 PowerShell API 的来源。文档提醒该库发布新版本时把命令中的版本号更新为最新即可dotnet add package PowerShellStandard.Library --version 3.0.0-preview-01用编辑器打开项目里的Class1.cs替换为下面这个简单的 cmdlet 源码。它声明了一个名为Write-TimestampedMessage的命令带一个位置参数Messageusing System; using System.Management.Automation; namespace MyModule { [Cmdlet(VerbsCommunications.Write, TimestampedMessage)] public class WriteTimestampedMessageCommand : PSCmdlet { [Parameter(Position1)] public string Message { get; set; } string.Empty; protected override void EndProcessing() { string timestamp DateTime.Now.ToString(u); this.WriteObject($[{timestamp}] - {this.Message}); base.EndProcessing(); } } }构建项目dotnet build在 PowerShell Core 中导入并验证文档特别提示前面几步在 Linux 上完全可以放在 Bash 等其他 shell 里执行但到导入这一步必须确认自己运行的是 PowerShell Core。构建产物位于项目的bin/Debug/netstandard2.0目录。进入该目录导入 DLL 并调用新命令cd bin/Debug/netstandard2.0 Import-Module ./MyModule.dll Write-TimestampedMessage Test message.命令执行后输出的[时间戳] - Test message.格式结果即为模块在 PowerShell Core 中正常工作的验证。Windows PowerShell 侧的兼容性判断文档说明编译为 .NET Standard 2.0 类库的程序集可以被 .NET Core 2.x 应用如 PowerShell Core和 .NET Framework 4.6.1 或更高版本的应用如 Windows PowerShell加载这是单一二进制模块跨两个 PowerShell 实现的基础。但它补充了一个关键边界在已更新到.NET Framework 4.7.1或预装该版本的 Windows 10 Fall Creators Update的系统上.NET Standard 2.0 二进制模块可以直接在 Windows PowerShell 中工作无需改动。在未更新到 .NET Framework 4.7.1 的 Windows 系统上模块无法正常运行。文档展示了后一种情况的复现与判断方法把MyModule.dll复制到一台 Windows 机器上文档以 Windows 10 CU 1703 或更低版本、未安装 .NET Framework 4.7.1 为例然后Import-Module .\MyModule.dll Write-TimestampedMessage Test message.判断点是导入不会报错错误出现在命令执行时。文档给出的错误现象如下文档示例输出Write-TimestampedMessage : Could not load file or assembly netstandard, Version2.0.0.0, Cultureneutral, PublicKeyTokencc7b13ffcd2ddd51 or one of its dependencies. The system cannot find the file specified. At line:1 char:1 Write-TimestampedMessage Test message. ~~~~~~~~~~~~~~~~~~~~~~~~ CategoryInfo : NotSpecified: (:) [], FileNotFoundException FullyQualifiedErrorId : System.IO.FileNotFoundException这个错误表示MyModule.dll找不到 Windows PowerShell 当前使用的 .NET Framework 版本对应的netstandard.dll实现程序集。如果命令能正常执行说明系统已经更新到 .NET Framework 4.7.1无需做下面的修复。可选分支为缺少 .NET Framework 4.7.1 的系统补充 netstandard.dll只在上面出现FileNotFoundException时才需要本节。前提是机器上已安装或先安装Windows 版 .NET Core SDK其中的 .NET 4.6.1 对应的netstandard.dll实现程序集位于C:\Program Files\dotnet\sdk\version-number\Microsoft\Microsoft.NET.Build.Extensions\net461\lib路径中的version-number是占位符需替换为实际安装的 SDK 版本号文档说明该值随已安装的 SDK 而变。操作顺序如下注意其中一步涉及文件复制确认已安装 .NET Core SDK for Windows。重新启动一个 Windows PowerShell 控制台。文档强调二进制程序集一旦加载进 PowerShell 就无法卸载必须重启 PowerShell 才能重新加载MyModule.dll。把netstandard.dll复制到MyModule.dll所在目录path-to-where-you-copied-module.dll替换为你实际放置 DLL 的目录cd path-to-where-you-copied-module.dll Copy-Item C:\Program Files\dotnet\sdk\version-number\Microsoft\Microsoft.NET.Build.Extensions\net461\lib\netstandard.dll .导入模块并执行命令Import-Module .\MyModule.dll Write-TimestampedMessage Test message.成功条件是命令正常输出。文档补充如果这一步仍失败重启 Windows PowerShell确认会话里没有之前加载过的旧程序集再重复第 4 步。限制与下一步如果你的模块还依赖其他第三方库文档指出可能涉及更多工作该netstandard.dll方案在文档中已使用System.Xml和System.Web中的类型成功测试过。文档的总结范围这样构建的 .NET Standard 2.0 二进制模块可以在多个操作系统上的 PowerShell Core 中运行也可以在已更新到 .NET Framework 4.7.1 的 Windows 系统的 Windows PowerShell 中运行构建本身可以在 Linux、macOS 和 Windows 上完成使用的都是 .NET Core 2.x SDK 的命令行工具。如果习惯图形界面而不是 CLI仓库提供了用 Visual Studio 构建同类模块的替代文档 Building a C# Cmdlet with Visual Studio其中 Building a C# Cmdlet for PowerShell Standard 3.0 部分对应同样的 PowerShell Standard 路线创建Class Library (.NET Standard)项目、确认目标框架为 .NET Standard 2.0、安装PowerShellStandard.Library包。该文档同时指出这条路线的限制面向 PowerShell Standard 意味着受限于可用的 PowerShell API 子集。【免费下载链接】PowerShellPowerShell for every system!项目地址: https://gitcode.com/GitHub_Trending/po/PowerShell创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考