2

当我直接从 Powershell 控制台运行我的脚本时,它可以工作。当我在 PowerGUI 中运行我的脚本并尝试实例化一个对象时,我得到一个错误:

使用“3”参数调用“.ctor”的异常:“无法加载文件或程序集'MyLib,Version=1.0.0.0,Culture=neutral,PublicKeyToken=77f676cc8f85d94e'或其依赖项之一。系统找不到指定文件。”

如果我将所有需要的 DLL 放在 $PSHOME 中,脚本将成功地从控制台运行,而不是 PowerGUI。如果我将 DLL 移动到本地目录并使用反射加载 DLL,则脚本将不会在 PowerGUI 或 powershell 控制台中运行。

[reflection.assembly]::loadfile('c:\mylibs\mylib.dll')

我需要做什么才能让脚本在 PowerGUI 中运行?理想情况下,我希望 DLL 位于与 $PSHOME 不同的目录中。

4

3 回答 3

4

您应该使用[Assembly]::LoadFrom而不是 LoadFile。LoadFile 旨在加载无法在正常程序集加载上下文中加载的程序集,例如尝试加载同一程序集的两个版本的情况。它不使用正常的探测规则,因此它不会自动加载依赖项。这是LoadFile文档的摘录。

使用 LoadFile 方法加载和检查具有相同标识但位于不同路径中的程序集。LoadFile 不会将文件加载到 LoadFrom 上下文中,也不会像 LoadFrom 方法那样使用加载路径解析依赖关系。LoadFile 在这种有限的场景中很有用,因为 LoadFrom 不能用于加载具有相同身份但不同路径的程序集;它只会加载第一个这样的程序集。

如果您使用的是 PowerShell 2.0,您可能希望使用 Add-Type 代替:

Add-Type -Path c:\mylibs\mylib.dll

如果所有其他方法都失败,请运行 Fuslogvw.exe以找出绑定失败的原因。

于 2010-01-05T22:04:46.093 回答
0

使用 set-psdebug -trace 2 查看它试图准确调用的内容。

于 2010-01-05T21:23:29.483 回答
0

这可能是因为 PowerGUI 是不同的 PowerShell 主机,因此它的“本地文件夹”是 PowerGUI 在 Program Files 中的文件夹,而不是 $pshome - 您放置 DLL 的地方。

于 2010-01-05T21:57:04.473 回答