2016-09-16 7 views
0

У меня есть двоичный модуль PowerShell, который ссылается на сборку «X», которую я хочу использовать NGEN, и использовать ее NI (собственное изображение) во время выполнения.Как PowerShell загружает зависимые сборки бинарного модуля?

В манифесте модуля я добавил сборку «X» в RequiredAssemblies.

Глядя в Fusion Log Viewer я вижу следующее:

  1. После Import-Module узел "X" не удается загрузить:

    Операция не удалась. Результат привязки: hr = 0x80070002. Система не может найти указанный файл.

  2. После вызова первой команды, которая нуждается в «X» FusLogViewer показывает новый рекорд для «X» с версией, культура и т.д. нагрузка в настоящее время успешно, но он находится в контексте LoadFrom, который предотвращает загрузку ее Н.И. ,

LOG: Эта привязка начинается в контексте загрузки LoadFrom.

WRN: Исходное изображение не будет исследовано в контексте LoadFrom. Собственное изображение будет проверяться только в контексте нагрузки по умолчанию, например, с Assembly.Load().

Мои вопросы здесь:

1. Каков механизм PowerShell для загрузки зависимых узлов?

2. Могу ли я каким-либо образом загрузить мою сборку «X» в контексте загрузки, чтобы использовать ее NI?

Спасибо! - Димитар

ответ

0

Ну, после нескольких отладок я узнал следующее:

Когда модуль находится в некоторых из $ ENV: PSModulePath, погрузка RequiredAssemblies проходит через

1. Ассамблея .LoadWithPartialName, который бросает ошибку я наблюдаю в FusionLogViewer, то алгоритм возвращается к

2. Assembly.LoadFrom разделяющим путь, используя путь модуля вступил т o имя сборки, указанное в качестве записи в RequiredAssemblies.

Последний загружает сборку в контексте LoadFrom.

Единственный способ загрузить сборку. Контекст загрузки - разместить модуль в папке $ PSHome \ Modules, которая является подпапкой файла powershell.exe, а затем добавить путь модуля к пути зондирования домена приложения, и вызвать LoadWithPartialName из некоторых сценариев модуля.

Вот как скрипт вызова выглядит следующим образом:

[AppDomain]::CurrentDomain.AppendPrivatePath("Modules\<My Module>") 
[reflection.assembly]::LoadWithPartialName('<Assembly Name>') | Out-Null 

я загрузить сборку из сценария, потому что загрузка RequiredAssemblies вызывается перед любой из сценариев модуля, но я обновлю зондирующих пути из сценария itslef , поэтому сборка удаляется из RequiredAssemblies и загружается вручную.