我正在尝试使用 PowerShell v4.0 (x86/64) 针对我们的内部 API 之一来执行一些相当基本的操作,但我似乎无法克服依赖项加载。
到目前为止我有:
[Reflection.Assembly]::LoadFrom("C:\Users\David Shaw\Desktop\API\API.dll")
根据 Dat Bui 的博客文章 http://blogs.msdn.com/b/datbui/archive/2007/05/09/powershell-and-net-loading.aspx.
这工作正常,然后我尝试使用此 DLL 中的类型:
$a = New-Object API.API("", 1234)
这给了我以下错误:
New-Object : Exception calling ".ctor" with "2" argument(s): "Unable to find assembly API.Dependency,
Version=1.2.5.0, Culture=neutral, PublicKeyToken=null'."
At line:1 char:6
+ $a = New-Object API.API("", 1234)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [New-Object], MethodInvocationException
+ FullyQualifiedErrorId : ConstructorInvokedThrowException,Microsoft.PowerShell.Commands.NewObjectCommand
查看FusionLog,它查找依赖关系的唯一位置是:C:\Windows\System32\WindowsPowerShell\v1.0
到目前为止我尝试过的事情:
- 设置 powershell 当前目录。
- 将其编写为脚本而不是从控制台编写。
- 我的依赖项与 API.dll 位于同一位置
- Using
LoadFile
代替LoadFrom
- Using
Add-Type -Path API.dll
- 设置.netCurrentDirectory https://stackoverflow.com/questions/6914080/powershell-dll-loading
- Calling
LoadFrom
关于依赖性。
- 在 Powershell 中执行 AppDomain.AssemblyResolve 事件(见下文),但此堆栈溢出 powershell:
从我的脚本:
$OnAssemblyResolve = [System.ResolveEventHandler] {
param($sender, $e)
$n = New-Object System.Reflection.AssemblyName($e.Name).Name
$fn = "C:\Users\David Shaw\Desktop\API\$n.dll"
return [Reflection.Assembly]::LoadFile($fn)
}
[System.AppDomain]::CurrentDomain.add_AssemblyResolve($OnAssemblyResolve)
根据评论,API.dll 是 .Net 4.0 (AnyCPU),API.Dependency.dll 是 .Net 2.0 (AnyCPU)。如果这可能是一个问题,有什么想法可以解决它吗?