Не удается запустить скрипт PowerShell для запуска в PowerGUI - PullRequest
2 голосов
/ 05 января 2010

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

Исключение вызывает ".ctor" с аргументом (ами) "3": "Не удалось загрузить файл или сборку" MyLib, версия = 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 ]

4 голосов
/ 06 января 2010

Вы должны использовать [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 , чтобы выяснить причину сбоя привязки.

0 голосов
/ 06 января 2010

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

0 голосов
/ 06 января 2010

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

...