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

问题描述

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进行了测试,可以确认是否发生了相同的问题。

我正在运行什么:

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

尝试使用以上两种方法之一加载时收到的错误

使用“ 1”作为参数调用“ LoadFile”的异常:“无法加载文件或程序集'mRemoteNG,Version = 1.77.0.41252,Culture = neutral,PublicKeyToken = null'。”

PublicKeyToken = null最初使我相信存在签名问题,但在Google周围搜索似乎表明这是一个依赖冲突。但是,在这种情况下,异常中没有像通常那样显示任何依赖性问题。

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

有人对这件事为什么发生以及如何解决有任何见识吗?

解决方法

事实证明,这是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。