Не удается запустить скрипт PowerShell для запуска в PowerGUI

Когда я запускаю свой скрипт прямо из консоли Powershell, он работает. Когда я запускаю свой скрипт в PowerGUI и пытаюсь создать экземпляр объекта, я получаю сообщение об ошибке:

Исключение вызывает ".ctor" с аргументом (ами) "3": "Не удалось загрузить файл или сборку" MyLib, Version=1.0.0.0, Culture= нейтральный, PublicKeyToken=77f676cc8f85d94e "или одну из ее зависимостей. Система не может найти указанный файл. "

Если я положу все необходимые библиотеки DLL в $PSHOME, скрипт будет успешно запущен из консоли, но не из PowerGUI. Если я переместу библиотеки DLL в локальный каталог и загружу библиотеки DLL с отражением, сценарий не будет работать ни в PowerGUI, ни в консоли powershell.

[Reflection.assembly]:: LoadFile('C:\mylibs\ MyLib.dll')

Что мне нужно сделать, чтобы скрипт запускался в PowerGUI? В идеале я хотел бы, чтобы DLL-библиотеки находились в другом каталоге, чем $PSHOME.

3 ответа

Решение

Вы должны использовать [Assembly]::LoadFrom, а не LoadFile. LoadFile предназначен для загрузки сборок, которые не могут быть загружены в обычном контексте загрузки сборок, например, в случае, когда вы пытаетесь загрузить две версии одной сборки. Он не использует нормальные правила проверки, поэтому он не загружает зависимости автоматически. Вот выдержка из документации для LoadFile.

Используйте метод LoadFile для загрузки и проверки сборок, которые имеют одинаковые идентификационные данные, но расположены по разным путям. LoadFile не загружает файлы в контекст LoadFrom и не разрешает зависимости, используя путь загрузки, как это делает метод LoadFrom. LoadFile полезен в этом ограниченном сценарии, потому что LoadFrom не может использоваться для загрузки сборок, которые имеют одинаковые идентификаторы, но разные пути; он загрузит только первую такую ​​сборку.

Если вы используете PowerShell 2.0, вы можете вместо этого использовать Add-Type:

Add-Type -Path c:\mylibs\mylib.dll

А если ничего не помогает, запустите Fuslogvw.exe, чтобы выяснить, почему сбой привязки.

Это может быть потому, что PowerGUI - это другой хост PowerShell, поэтому его "локальная папка" - это папка PowerGUI в Program Files, а не $pshome, куда вы помещаете библиотеки DLL.

Используйте set-psdebug -trace 2, чтобы увидеть, что именно он пытается вызвать.

Другие вопросы по тегам