【问题标题】:Unable to load a .NET assembly in PowerShell 7无法在 PowerShell 7 中加载 .NET 程序集
【发布时间】:2020-08-25 18:29:35
【问题描述】:

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 - 失败
    • Add-Type -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 最初让我相信存在签名问题,但谷歌搜索似乎表明这是一个依赖冲突。但是,在这种情况下,异常中不会像通常那样指出依赖问题。

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

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

【问题讨论】:

  • “在 5.1 和 7 中使用相同的 .NET 版本运行会产生两个完全不同的结果” 这些版本的 PowerShell 不使用相同版本的 .NET。 v7 使用 .NET Core,它是 v5.1 使用的完整版本的一个子集,所以有些东西根本行不通。例如,这是一个最近有类似问题的问题:Function ported from Powershell 5 to Powershell 7 fails ...
  • @boxdog 确实,这是我不知道的,并且在其他论坛上被其他一些用户指出。我最终确实找到了这个问题的解决方案,而且它甚至没有像我最初想象的那样变成.NET。在下面发帖!

标签: .net powershell .net-4.0 powershell-7.0


【解决方案1】:

这原来是 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。

【讨论】:

    猜你喜欢
    • 2015-10-11
    • 1970-01-01
    • 2012-01-10
    • 1970-01-01
    • 1970-01-01
    • 2011-10-14
    • 1970-01-01
    • 2021-09-21
    • 1970-01-01
    相关资源
    最近更新 更多