引用其他项目dll的C#cmdlet dll在加载时失败

时间:2017-02-21 11:12:51

标签: c# powershell cmdlet

我有一个用作PowerShell cmdlet的C#项目 - 这应该是产品主要功能的API - 所以我必须在我的PowerShell库中引用很多dll。

我的问题是客户希望从任何位置加载PowerShell dll,而无需将工作目录设置到所有dll所在的程序文件夹。但是,如果我通过快捷方式打开Powershell,我只能使用我的PowerShell命令,其中工作目录设置为程序文件文件夹,如下所示:

C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe -noexit -command "[reflection.assembly]::loadFrom('.\PSAPI.dll') | import-module"

并将工作目录设置到已安装产品的程序文件文件夹中。

如果我只是使用

[Reflection.Assembly]::LoadFile("C:\Program Files(x86)\MyProduct\PSAPI.dll")

[Reflection.Assembly]::LoadFrom("C:\Program Files(x86)\MyProduct\PSAPI.dll")

总是失败。是否有解决方案(不将所有文件复制到PowerShell文件夹)?

这是我尝试的和我得到的错误 - 我无法以其他方式设置引用的dll - .NET应用程序正在查找引用的dll的工作目录 - 我在powershell中设置工作目录以确保我在正确的目录中,但它不会加载我的模块

[reflection.assembly]::loadFrom( 'C:\Program Files (x86)\ASG-Remoteesktop 2016\ASGRD-PSAPI.dll' ) | import-module

使用“1”参数调用“LoadFrom”的异常:“无法加载文件或 程序集'file:/// C:\ Program Files(x86)\ ASG-Remoteesktop 2016 \ ASGRD-PSAPI.dll'或其依赖项之一。系统找不到了 文件指定。“ 在行:1个字符:1 + [reflection.assembly] :: loadFrom('C:\ Program Files(x86)\ ASG-Remoteesktop 2016 \ A ...... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~     + CategoryInfo:NotSpecified:(:) [],MethodInvocationException     + FullyQualifiedErrorId:FileNotFoundException

2 个答案:

答案 0 :(得分:0)

在这里猜测你还没有提供错误,但是如果它是从同一个目录而不是从另一个目录运行,则可能是C#DLL使用相对路径。

当前目录为C:\Program Files(x86)\MyProduct时,如果您使用完整路径或仅使用Resources\MyFile.dat并不重要,则两者最终都会在同一位置。但是,如果您在根C:中,相对路径将查找C:\Resources\MyFile.dat,当然这不存在。当您使用C:\Program Files(x86)\MyProduct\Resources\MyFile.dat时,当前目录并不重要,它始终有效。

检查您的C#DLL是否有任何相对路径,并临时更改工作目录或使用绝对路径。

答案 1 :(得分:0)

一种方法可能是:将汇编路径C:\Program Files(x86)\MyProduct添加到PSModulePath环境变量。完成后,您可以执行import-module -name <name of your module>,它将从您的文件夹中加载它。在这种情况下,您不需要显式加载程序集(最有可能)。

有关详细信息,请在powershell中执行以下命令,并检查为-name参数提供的详细信息。

get-help import-module -detailed