PowerShell如何加载二进制模块的依赖程序集?

时间:2016-09-16 13:40:28

标签: .net powershell powershell-module

我有一个PowerShell二进制模块,它引用了一个程序集" X"我想NGEN并在运行时使用它的NI(原生图像)。

在模块清单中,我添加了" X"在RequiredAssemblies中组装。

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

  1. 导入后 - 组装组件" X"无法加载:

      

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

  2. 在调用第一个需要" X" FusLogViewer显示" X"的新记录。与版本,文化等 负载现在成功但它在LoadFrom上下文中阻止加载其NI。

  3.   

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

         

    警告:不会在LoadFrom上下文中探测本机映像。仅在默认加载上下文中探测本机映像,例如Assembly.Load()。

    我的问题是:

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

    2。我可以以某种方式加载我的" X"在Load上下文中汇编以使用其NI?

    谢谢! - Dimitar

1 个答案:

答案 0 :(得分:0)

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

当模块位于某些$ env:PSModulePath中时,RequiredAssemblies的加载将通过

<强> 1。 Assembly.LoadWithPartialName ,抛出我在FusionLogViewer中观察到的错误,然后算法回到

<强> 2。 Assembly.LoadFrom 使用模块的路径解析路径,该路径连接到在RequiredAssemblies中指定为条目的程序集名称。

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

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

以下是脚本调用的样子:

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

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