如何从 WinUI 3 C# 应用程序托管 PowerShell 5

How to Host PowerShell 5 from WinUI 3 C# App

希望在面向 .NET 6 的 C# WinUI 3 应用程序中获得有关 hosting PowerShell 5.1 的一些指导。我一直在尝试许多不同的 NuGet 包,不幸的是,我唯一能够开始工作的是调用 PowerShell 7。就我而言,我需要能够调用 PowerShell 5.1...

我尝试添加的包:

我可以通过调用一个新进程来解决这个问题:

var script = "C:\scripts space\MultiLineTestScript.ps1";
var process = new Process
{
     StartInfo = new ProcessStartInfo(@"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe", "-ExecutionPolicy Bypass -NoProfile -File \"" + script + "\"")
        {
            RedirectStandardOutput = true,
            CreateNoWindow = true
        }
 };
 process.Start();

这是可行的,但话虽如此,我宁愿尽可能使用受支持的 SDK 或参考程序集。特别是为了更轻松地实现 运行spaces 并让 PowerShell 主机在单独的线程上 运行 而无需挂起 UI.

我找到了这个:https://devblogs.microsoft.com/powershell/depending-on-the-right-powershell-nuget-package-in-your-net-project/

在 WinUI 3 .net Core 应用程序中托管 Windows PowerShell 5.1 不是 supported/possible 吗?任何帮助将不胜感激,我通常是 PowerShell 用户而不是 C# 开发人员,但我正在跌跌撞撞。

tl;dr

  • 在 .NET (Core) 应用程序中托管 Windows PowerShell SDK 不可能,因为您已确认 via Twitter.

  • 通过其 CLI 在 子进程 中调用 PowerShell,powershell.exe 可能确实是您唯一的选择。


首先回顾一下:

由于 Windows PowerShell 基于遗留的 Windows-only .NET Framework(与其后继者 cross-platform 相对)。 NET Core / .NET 5+ 框架),允许在应用程序中托管 Windows PowerShell 的 NuGet SDK 包也是如此,Microsoft.PowerShell.5.1.ReferenceAssemblies.

您的项目以 .NET 6.0 (net60) 为目标,这就是您在构建项目时看到有关目标框架不匹配的警告的原因。


虽然这只是一个 警告 而不是错误,但表明这种不匹配的组合 可能 在某些情况下仍然有效,这不是 尝试在 .NET (Core) 6.0 应用程序中托管 Windows PowerShell 的情况:尝试抛出 异常实例化 PowerShell class:System.InvalidProgramException: Common Language Runtime detected an invalid program.

使用 Microsoft.Windows.Compatibility package (discussed in this article) 没有帮助。

因此,通过 CLIpowershell.exe 作为 子进程 调用 Windows PowerShell 确实是您的最佳选择。

除了更慢更resource-intensive之外,另一个缺点是只能接收文本输出。