无法在 PowerShell 7 中加载 .NET 程序集

Unable to load a .NET assembly in PowerShell 7

mRemoteNG是一个多远程协议连接客户端,类似RDCMan,但支持SSH、VNC等其他协议

我正在制作 mRemoteNG Create Bulk Connections 脚本的自定义版本。该脚本是为 PS 5.1 编写的,我正尝试将其与脚本中的许多其他组件一起更新为 7。该脚本通过 PS 批量创建连接,因此不需要通过 UI 完成(如果你有很多要添加的东西,那将是一个巨大的痛苦)。

为了创建每个连接对象,通过 mRemoteNG.exe 构建了一个强类型的 .NET 对象,该对象稍后被序列化并导出到 XML。我正在尝试执行第一步:在当前会话中加载 mRemoteNG.exe 以在管道中进一步创建强类型 .NET 对象。

在 5.1 中,我可以使用 [System.Reflection.Assembly]::LoadFile() 毫无问题地加载 mRemoteNG.exe。 7、同样的方法不行。我知道上面的方法最终会被弃用,因此切换到 Add-Type 希望解决问题,但得到了相同的结果。

要准确测试以下内容,您需要下载 mRemoteNG here。我在我的机器上使用 v1.77,建议您也这样做以最准确地重现此问题。但是,我已经针对 1.76 进行了测试,可以确认发生了同样的问题。

我是什么运行:

我在尝试使用上述任一方法加载时收到的错误:

Exception calling "LoadFile" with "1" argument(s): "Could not load file or assembly 'mRemoteNG, Version=1.77.0.41252, Culture=neutral, PublicKeyToken=null'."

PublicKeyToken=null 最初让我相信存在签名问题,但谷歌搜索似乎表明这是一个依赖冲突。但是,在这种情况下,异常中没有指示任何依赖性问题,因为它通常会是这样。

值得注意的是,mRemoteNG 需要 .NET 4.6。 运行 [System.Reflection.Assembly]::GetExecutingAssembly().ImageRuntimeVersion in PS 5.1 和 7 表示我系统上的默认值是 4.0.30319。我很难理解 PS 运行 5.1 和 7 中的相同 .NET 版本如何产生两个完全不同的结果。

有没有人知道为什么会发生这种情况以及如何解决?

这原来是 PowerShell 架构的问题。请注意,mRemoteNG 存储在 Program Files (x86) 目录中,它是一个 32 位应用程序。我试图在 64 位 PowerShell 会话中 运行 它,因此它无法按预期运行。错误消息对确定这一点毫无帮助,所以感谢 reddit 上的人们。com/r/powershell 是第二双眼睛!

也许这个问题最奇怪的部分是 mRemoteNG 二进制文件将 运行 在 Windows PowerShell 5.1 x64 中,但不会在 PowerShell Core 7.0.3 x64 中。在 PowerShell Core 7.0.3 x86 中它必须是 运行。这种不一致的行为最初让我失望,甚至没有考虑尝试 PowerShell 7.0.3 的 x86 版本。