Не удалось загрузить сборку .NET в PowerShell 7

mRemoteNG — это клиент подключения с несколькими удаленными протоколами, сравнимый с RDCMan, но с поддержкой других протоколов, таких как SSH, VNC и т. д.

Я делаю пользовательскую версию mRemoteNG Create Bulk Connections сценарий. Скрипт написан для PS 5.1, пытаюсь обновить его до 7 вместе с рядом других компонентов внутри скрипта. Сценарий создает пакеты соединений через PS, поэтому это не нужно делать через пользовательский интерфейс (гигантская головная боль, если у вас есть что добавить).

Для создания каждого объекта соединения с помощью mRemoteNG.exe создается строго типизированный объект .NET, который затем сериализуется и экспортируется в XML. Я пытаюсь выполнить первый шаг: загрузить mRemoteNG.exe в текущем сеансе, чтобы создать строго типизированные объекты .NET дальше по конвейеру.

В версии 5.1 я могу без проблем загрузить mRemoteNG.exe, используя [System.Reflection.Assembly]::LoadFile(). В 7 этот же метод не работает. Я понимаю, что вышеуказанный метод в конечном итоге устарел, и поэтому переключился на Add-Type в надежде решить проблему, но получил тот же результат.

Чтобы точно проверить приведенное ниже, вам необходимо загрузить mRemoteNG здесь. Я использую v1.77 на своей машине и предлагаю вам сделать то же самое, чтобы добиться наиболее точного воспроизведения этой проблемы. Однако я проверил это на 1.76 и могу подтвердить, что возникает та же проблема.

Что я запускаю:

  • PowerShell 5.1 - SUCCESS
    • [System.Reflection.Assembly]::LoadFile("C:\Program Files (x86)\mRemoteNG\mRemoteNG.exe")
  • PowerShell 7.0.3 - FAIL
    • Add-Type -Path ("C:\Program Files (x86)\mRemoteNG\mRemoteNG.dll")
    • Обратите внимание, что вы все еще можете использовать версию PS 5.1 в 7, в любом случае это не удастся.
    • Я сделал копию mRemoteNG и переименовал ее в mRemoteNG.dll, потому что Add-Type не поддерживает .exe

Ошибка, которую я получаю при попытке загрузить любой из вышеперечисленных методов:

Исключение при вызове LoadFile с 1 аргументом (аргументами): не удалось загрузить файл или сборку «mRemoteNG, версия = 1.77.0.41252, культура = нейтральная, PublicKeyToken = null».

PublicKeyToken=null изначально заставил меня поверить, что возникла проблема с подписью, но поиск в Google, похоже, указывает на то, что это конфликт зависимостей. Однако в этом случае в исключении не указывается проблема с зависимостями, как это обычно бывает.

Стоит отметить, что для mRemoteNG требуется .NET 4.6. Запуск [System.Reflection.Assembly]::GetExecutingAssembly().ImageRuntimeVersion в PS 5.1 и 7 указывает, что по умолчанию в моей системе используется 4.0.30319. Я изо всех сил пытаюсь понять, как PS, работающий с одной и той же версией .NET в 5.1 и 7, дает два совершенно разных результата.

Кто-нибудь знает, почему это происходит и как это можно решить?


person Brendan Lovett    schedule 25.08.2020    source источник
comment
запуск одной и той же версии .NET в 5.1 и 7 дает два совершенно разных результата Эти версии PowerShell используют разные версии .NET. v7 использует .NET Core, который является подмножеством полной версии, используемой в v5.1, поэтому некоторые вещи просто не будут работать. Например, вот недавний вопрос с похожими проблемами: Функция, перенесенная из Powershell 5 в Powershell 7, не работает...   -  person boxdog    schedule 26.08.2020
comment
@boxdog действительно, это было то, чего я не знал, и на это указывали некоторые другие пользователи на другом форуме. В итоге я нашел решение этой проблемы, и оказалось, что это даже не .NET, как я изначально думал. Сообщение ниже!   -  person Brendan Lovett    schedule 26.08.2020


Ответы (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.

person Brendan Lovett    schedule 26.08.2020