0

NGEN にしたいアセンブリ "X" を参照し、実行時にその NI (ネイティブ イメージ) を使用する PowerShell バイナリ モジュールがあります。

モジュール マニフェストで、RequiredAssemblies に "X" アセンブリを追加しました。

Fusion Log Viewer を見ると、次のように表示されます。

  1. Import-Module の後、アセンブリ "X" の読み込みに失敗します。

    操作に失敗しました。バインド結果: hr = 0x80070002。システムは、指定されたファイルを見つけることができません。

  2. "X" を必要とする最初のコマンドを呼び出した後、FusLogViewer はバージョン、カルチャなどを含む "X" の新しいレコードを表示します。ロードは成功しましたが、NI のロードを妨げる LoadFrom コンテキストにあります。

ログ: このバインドは LoadFrom ロード コンテキストで開始されます。

WRN: ネイティブ イメージは LoadFrom コンテキストではプローブされません。ネイティブ イメージは、Assembly.Load() のように、既定の読み込みコンテキストでのみプローブされます。

ここでの私の質問は次のとおりです。

1. 依存アセンブリを読み込むための PowerShell メカニズムは何ですか?

2. NI を使用するために、「X」アセンブリをロード コンテキストにロードすることはできますか?

ありがとう!- ディミタル

4

1 に答える 1

0

さて、いくつかのデバッグの後、次のことがわかりました。

モジュールが $env:PSModulePath の一部にある場合、RequiredAssemblies の読み込みが行われます

1. Assembly.LoadWithPartialNameは、FusionLogViewer で観察したエラーをスローし、アルゴリズムは次のようにフォールバックします。

2. RequiredAssemblies のエントリとして指定されたアセンブリ名に結合されたモジュールのパスを使用してパスを解決する Assembly.LoadFrom。

最後は、LoadFrom コンテキストでアセンブリを読み込みます。

アセンブリのロード コンテキストをロードするために私が見つけた唯一の方法は、モジュールを powershell.exe のサブフォルダーである $PSHome\Modules フォルダーに配置し、モジュールのパスをアプリ ドメインのプローブ パスに追加し、LoadWithPartialName を呼び出すことです。モジュールスクリプトの一部。

スクリプト呼び出しは次のようになります。

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

RequiredAssemblies の読み込みはどのモジュール スクリプトよりも前に呼び出されるため、スクリプトからアセンブリを読み込みますが、スクリプト自体からプローブ パスを更新するため、アセンブリは RequiredAssemblies から削除され、手動で読み込まれます。

于 2016-09-26T07:03:37.473 に答える