无法在Powershell中加载.net程序集
本文关键字:加载 net 程序集 Powershell | 更新日期: 2023-09-27 18:03:45
我有一个来自供应商的SDK,其中我使用了一个特定的DLL,它提供了与供应商系统的COM互操作。
我已经成功地创建了一个POC c#项目使用类在这个DLL。我添加了对DLL的引用,添加了命名空间的using子句,瞧。我的目标框架是4.0,平台是x86。
我现在想使用Powershell来完成相同的任务,但是我无法获得DLL加载。
当我尝试
add-type -path $myDLL
或
[System.Reflection.Assembly]::LoadFrom($myDLL)
我得到以下异常:
add-type : Could not load file or assembly 'file:///C:'Program Files
(x86)'Interwoven'WorkSite'IManage.dll' or one of its dependencies. The module was expected to contain
an assembly manifest.
At line:2 char:1
+ add-type -path $myDLL
+ ~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [Add-Type], BadImageFormatException
+ FullyQualifiedErrorId : System.BadImageFormatException,Microsoft.PowerShell.Commands.AddTypeComma
nd
我已经确认我在Powershell x86中运行,我甚至尝试使用这里描述的方法强制CLRVersion匹配DLL ImageRuntimeVersion,但没有成功。
我还错过了什么?谢谢!
PS H:'> $env:processor_architecture
x86
PS H:'> $psversiontable
Name Value
---- -----
PSVersion 3.0
WSManStackVersion 3.0
SerializationVersion 1.1.0.1
CLRVersion 4.0.30319.34209
BuildVersion 6.2.9200.16398
PSCompatibleVersions {1.0, 2.0, 3.0}
PSRemotingProtocolVersion 2.2
这里的主要线索是BadImageFormatException。这意味着您要么尝试将32位dll加载到64位PowerShell进程中,要么将64位dll加载到32位PowerShell进程中。
是供应商提供您正在加载的互操作DLL还是您使用tlbimp之类的工具生成它?通常这些dll是体系结构中立的(任何CPU),除非它们需要调用dll或加载进程中的COM dll。
在我的情况下,我有一个内容替换脚本,它正在破坏dll。然而,Add-Type似乎会缓存程序集,甚至是加载失败的程序集,这使情况变得复杂。我用一个好的dll替换了dll,它继续失败,直到我试图从不同的位置加载它(我想象关闭powershell ISE也会修复它)。