2015-07-21 27 views
0

我有一個來自供應商的SDK,其中我使用了一個特定的DLL,它提供了與供應商系統進行COM互操作的DLL。無法在Powershell中加載.NET程序集

我已成功創建一個使用此DLL中的類的POC C#項目。我添加對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中運行,我甚至嘗試強制CLRVersion使用m來匹配DLL ImageRuntimeVersion方法描述here沒有成功。

我還有什麼在這裏失蹤?謝謝!

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 
+0

您需要運行32位的PowerShell控制檯。 C:\ Windows \ SysWOW64 \ WindowsPowerShell \ v1.0 \ powershell.exe 無法在64位進程中加載​​32位dll,反之亦然,除非dll是針對任何Cpu編譯的,在這種情況下.Net JIT's它到適當的平臺。 com interop dll不是這種情況。 –

+0

我正在運行32位PowerShell會話 – Yevgeniy

+0

請注意,'$ env:Processor_Architecture'告訴您處理器體系結構不是進程位。當然,由於它是x86,因此不可能錯誤地運行64位進程。使用'[Environment] :: Is64BitProcess'來判斷當前進程是否爲64位。 –

回答

1

這裏的主要線索是BadImageFormatException。這意味着您要麼將32位dll加載到64位PowerShell進程中,要麼將64位dll加載到32位PowerShell進程中。

供應商是否提供了您正在加載的interop DLL,或者您是否使用類似tlbimp的工具生成了它?通常這些DLL是架構中立(任何CPU),除非他們需要pinvke到一個DLL或加載COM DLL的過程中。

+0

是的,但我檢查我的$ env:PROCESSOR_ARCHITECTURE是x86,它與我的C#項目構建平臺目標匹配。我曾嘗試加載這個在x64 poweshell版本只是爲了它的地獄,結果相同。如果進程比特率(?)與DLL的匹配,那麼還有什麼可能呢?供應商正在提供該DLL。 – Yevgeniy

+1

BadImageFormatException可能因[多種原因](https://msdn.microsoft.com/en-us/library/system.badimageformatexception(v = vs.110).aspx)而發生,並且此處的錯誤消息指示了其他原因。 OP試圖加載一個非託管的dll作爲.NET dll。如果您嘗試在32位或64位進程中加載​​kernel32.dll,則會發生同樣的錯誤(使用相同的消息)。 –

+0

這個問題表明它是一個C#項目。但是,如果該項目使用另一個調用本地DLL的庫或項目直接調用本地DLL,則會發生此異常。如果不需要禁止本地DLL,那麼該項目應該以任何CPU爲「最佳32位」取消選中,以獲得最大的靈活性。 –

0

在我的情況下,我有一個內容替換腳本損壞了DLL。然而,這很複雜,因爲Add-Type看起來像緩存程序集,甚至加載失敗。我用一個好的替換了dll,並且它繼續失敗,直到我嘗試從不同的位置加載它(我想象關閉PowerShell ISE也會修復它)。