【发布时间】:2014-06-09 17:07:10
【问题描述】:
我正在尝试针对我们的一个内部 API 使用 PowerShell v4.0 (x86/64) 来做一些相当基本的事情,但我似乎无法通过依赖加载。
到目前为止我有:
[Reflection.Assembly]::LoadFrom("C:\Users\David Shaw\Desktop\API\API.dll")
根据 Dat Bui 的blog post。
这很好,然后我尝试在这个 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 位于同一位置
- 使用
LoadFile代替LoadFrom - 使用
Add-Type -Path API.dll - Setting the .net
CurrentDirectory - 在依赖项上调用
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)。如果这可能是一个问题,有什么想法可以解决吗?
【问题讨论】:
-
这里的猜测是......可能与支持的运行时有关吗?您的 API.dll 及其依赖项是用什么版本的 .Net 编译的?还是与您使用的 PowerShell 的位数不对应的 DLL 位数相关?
-
@DavidBrabant 我已经尝试了两个 powershell 版本,没有区别。我在最后的问题中添加了 .net 版本。
-
我很惊讶
Add-Type -Path C:\Users\David Shaw\Desktop\API\API.dll; Add-Type -Path C:\Users\David Shaw\Desktop\API\API.Dependency.dll不起作用。或者至少指向加载器找不到的另一个依赖程序集。 -
@KeithHill,可以肯定的是,我已在此 API 所需的每个 DLL 上使用了 Add-Type -Path。它仍然以同样的方式失败。
-
作为一个快速实验来确定这是加载程序问题还是其他问题,请将所有必需的程序集复制到
C:\Windows\System32\WindowsPowerShell\v1.0。如果仍然失败,那么还有其他事情发生(缺少程序集依赖等)。
标签: .net powershell .net-assembly