无法在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   

无法在Powershell中加载.net程序集

这里的主要线索是BadImageFormatException。这意味着您要么尝试将32位dll加载到64位PowerShell进程中,要么将64位dll加载到32位PowerShell进程中。

是供应商提供您正在加载的互操作DLL还是您使用tlbimp之类的工具生成它?通常这些dll是体系结构中立的(任何CPU),除非它们需要调用dll或加载进程中的COM dll。

在我的情况下,我有一个内容替换脚本,它正在破坏dll。然而,Add-Type似乎会缓存程序集,甚至是加载失败的程序集,这使情况变得复杂。我用一个好的dll替换了dll,它继续失败,直到我试图从不同的位置加载它(我想象关闭powershell ISE也会修复它)。