我有一个PowerShell二进制模块,它引用了一个程序集" X"我想NGEN并在运行时使用它的NI(原生图像)。
在模块清单中,我添加了" X"在RequiredAssemblies中组装。
查看Fusion Log Viewer我看到以下内容:
导入后 - 组装组件" X"无法加载:
操作失败。绑定结果:hr = 0x80070002。系统找不到指定的文件。
在调用第一个需要" X" FusLogViewer显示" X"的新记录。与版本,文化等 负载现在成功但它在LoadFrom上下文中阻止加载其NI。
日志:此绑定在LoadFrom加载上下文中开始。
警告:不会在LoadFrom上下文中探测本机映像。仅在默认加载上下文中探测本机映像,例如Assembly.Load()。
我的问题是:
1。什么是加载依赖程序集的PowerShell机制?
2。我可以以某种方式加载我的" X"在Load上下文中汇编以使用其NI?
谢谢! - Dimitar
答案 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中删除并手动加载。