0

我有一个 PowerShell 二进制模块,它引用了我想要 NGEN 并在运行时使用它的 NI(本机映像)的程序集“X”。

在模块清单中,我在RequiredAssemblies 中添加了“X”程序集。

查看 Fusion Log Viewer 我看到以下内容:

  1. 导入模块后,程序集“X”无法加载:

    操作失败。绑定结果:hr = 0x80070002。该系统找不到指定的文件。

  2. 在调用第一个需要“X”的命令后,FusLogViewer 显示“X”的新记录,包括版本、文化等。现在加载成功,但它位于 LoadFrom 上下文中,这阻止了加载其 NI。

LOG:此绑定在 LoadFrom 加载上下文中开始。

警告:将不会在 LoadFrom 上下文中探测本机图像。本机映像只会在默认加载上下文中进行探测,例如使用 Assembly.Load()。

我的问题是:

1、PowerShell加载依赖程序集的机制是什么?

2. 我可以在加载上下文中加载我的“X”程序集以使用它的 NI 吗?

谢谢你!- 迪米塔

4

1 回答 1

0

好吧,经过几次调试后,我发现了以下内容:

当模块在某些 $env:PSModulePath 中时,RequiredAssemblies 的加载会通过

1. Assembly.LoadWithPartialName,它抛出了我在 FusionLogViewer 中观察到的错误,然后算法回退到

2. Assembly.LoadFrom通过使用连接到在RequiredAssemblies 中指定为条目的程序集名称的模块路径来解析路径。

最后在 LoadFrom 上下文中加载程序集。

我发现加载程序集加载上下文的唯一方法是将模块放在 $PSHome\Modules 文件夹中,该文件夹是 powershell.exe 的子文件夹,然后将模块的路径添加到应用程序域探测路径,并调用 LoadWithPartialName 从一些模块脚本。

下面是脚本调用的样子:

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

我从脚本加载程序集,因为在任何模块脚本之前调用了RequiredAssemblies 的加载,但是我从脚本本身更新了探测路径,因此程序集从RequiredAssemblies 中删除并手动加载。

于 2016-09-26T07:03:37.473 回答