如何从 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...
我尝试添加的包:
Microsoft.PowerShell.5.ReferenceAssemblies - 不兼容
- 警告 NU1701 包 'Microsoft.PowerShell.5.ReferenceAssemblies 1.1.0' 已使用“.NETFramework,Version=v4.6.1, .NETFramework,Version=v4.6.2, .NETFramework,Version=v4.7, .NETFramework,Version=v4”恢复.7.1, .NETFramework,Version=v4.7.2, .NETFramework,Version=v4.8' 而不是项目目标框架 'net6.0-windows10.0.19041'。此包可能与您的项目不完全兼容。
Microsoft.PowerShell.SDK - 仅适用于 PowerShell 7,不适用于 Windows PowerShell 5.1
PowerShellLibrary.Standard - 我认为这不适用于应用程序中的 托管 PowerShell
我可以通过调用一个新进程来解决这个问题:
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.
在 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) 没有帮助。
因此,通过 CLI、powershell.exe
作为 子进程 调用 Windows PowerShell 确实是您的最佳选择。
除了更慢更resource-intensive之外,另一个缺点是只能接收文本输出。
希望在面向 .NET 6 的 C# WinUI 3 应用程序中获得有关 hosting PowerShell 5.1 的一些指导。我一直在尝试许多不同的 NuGet 包,不幸的是,我唯一能够开始工作的是调用 PowerShell 7。就我而言,我需要能够调用 PowerShell 5.1...
我尝试添加的包:
Microsoft.PowerShell.5.ReferenceAssemblies - 不兼容
- 警告 NU1701 包 'Microsoft.PowerShell.5.ReferenceAssemblies 1.1.0' 已使用“.NETFramework,Version=v4.6.1, .NETFramework,Version=v4.6.2, .NETFramework,Version=v4.7, .NETFramework,Version=v4”恢复.7.1, .NETFramework,Version=v4.7.2, .NETFramework,Version=v4.8' 而不是项目目标框架 'net6.0-windows10.0.19041'。此包可能与您的项目不完全兼容。
Microsoft.PowerShell.SDK - 仅适用于 PowerShell 7,不适用于 Windows PowerShell 5.1
PowerShellLibrary.Standard - 我认为这不适用于应用程序中的 托管 PowerShell
我可以通过调用一个新进程来解决这个问题:
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.
在 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) 没有帮助。
因此,通过 CLI、powershell.exe
作为 子进程 调用 Windows PowerShell 确实是您的最佳选择。
除了更慢更resource-intensive之外,另一个缺点是只能接收文本输出。