0

mRemoteNG 是一个多远程协议连接客户端,与 RDCMan 相媲美,但支持其他协议,如 SSH、VNC 等。

我正在制作mRemoteNG 创建批量连接脚本的自定义版本。该脚本是为 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 。我在我的机器上使用 v1.77,建议您也这样做以最准确地重现此问题。但是,我已经针对 1.76 对此进行了测试,并且可以确认发生了同样的问题。

我正在运行的内容:

  • PowerShell 5.1 - 成功
    • [System.Reflection.Assembly]::LoadFile("C:\Program Files (x86)\mRemoteNG\mRemoteNG.exe")
  • PowerShell 7.0.3 - 失败
    • Add-Type -Path ("C:\Program Files (x86)\mRemoteNG\mRemoteNG.dll")
    • 请注意,您仍然可以在 7 中使用 PS 5.1 版本,无论哪种方式都会失败
    • 我复制了一份 mRemoteNG 并将其重命名为 mRemoteNG.dll,因为 Add-Type 不支持 .exe

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

使用“1”参数调用“LoadFile”的异常:“无法加载文件或程序集'mRemoteNG,版本 = 1.77.0.41252,文化 = 中性,PublicKeyToken = null'。”

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

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

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

4

1 回答 1

0

事实证明,这是 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 中运行。这种不一致的行为最初让我感到厌烦,甚至没有考虑尝试 x86 版本的 PowerShell 7.0.3。

于 2020-08-26T13:27:46.823 回答