2014-06-18 33 views
0

我有第三方DLL與他們的應用程序集成。它是一個32位的C++ DLL,它不通過COM公開自己,並且我沒有提供源代碼或頭文件。DllNotFoundException從C#但不是VB.NET

它在WinForms示例中提供了工作的VB.NET示例代碼。只要可執行文件與API DLL以及API所連接的應用程序在同一目錄中運行,就可以工作。

我所用的例子函數聲明:

Declare Ansi Function GetVersion Lib "ThirdPartyAPI.dll"() As Integer 

但是,我們將使用從C#庫的網站或網絡服務中使用的API調用,所以我轉換的例子VB代碼

[DllImport("ThirdPartyAPI.dll", SetLastError = true, CharSet = CharSet.Ansi)] 
public static extern int GetVersion(); 

如果我把這個從C#庫中我得到的錯誤

Unhandled Exception: System.DllNotFoundException: Unable to load DLL 
'ThirdPartyAPI.dll': A dynamic link library (DLL) initialization 
routine failed. (Exception from HRESULT: 0x8007045A) 

我選擇了一個替代路線,並將來自該示例的原始VB代碼放入其自己的VB.NET DLL中,並通過C#調用該代碼。我得到了同樣的錯誤。奇怪的是,從VB.NET控制檯應用程序調用VB.NET DLL的作品。

總結:

  • 一個簡單的VB.NET控制檯應用程序將工作
  • 一個簡單的VB.NET WinForms應用程序將工作
  • 一個簡單的VB.NET控制檯應用程序可以通過VB調用GetVersion .NET DLL
  • 簡單的C#控制檯應用程序無法通過VB.NET DLL調用GetVersion
  • 簡單的C#控制檯應用程序無法直接調用GetVersion。 這可能與錯誤地定義函數調用有關。在 這個階段,我並不太擔心這一點。
  • 32位編譯不能解決問題
  • 我已經試過這Server 2008 R2和Windows 7企業版

我通過NT服務創建的WCF主機暴露在功能上,希望這會工作圍繞文件位置和依賴關係。這是用VB.NET編寫的,並放在與ThirdPartyApi.dll相同的文件夾中。

  • 沒有在NT服務的代碼可以訪問GetVersion
  • 在WCF服務
  • 無代碼可以訪問GetVersion

請注意,在上述所有情況下,可執行文件與ThirdPartyApi.dll位於同一目錄中。它的所有依賴關係也存在於這個目錄中。

任何人都可以解釋這種行爲,或者建議如何在C#網站中工作嗎?

謝謝

+0

你爲什麼使用'SetLastError = true'?你爲什麼使用'CharSet.Ansi'? –

+0

我不確定'SetLastError = true',但VB示例代碼將該調用定義爲'Declare Ansi Function GetVersion Lib「ThirdPartyAPI.dll」()As Integer',並且該代碼有效。 – mooncat69

+0

該函數沒有文本參數,所以charset是無關緊要的 –

回答

0

錯誤代碼是0x8007045A。這是映射到Win32錯誤代碼ERROR_DLL_INIT_FAILED的COM錯誤代碼。其描述如下:

動態鏈接庫(DLL)初始化例程失敗。

這意味着你的DLL被發現,儘管可能有誤導性的異常類DllNotFoundException。但是,DLL無法加載。您不能從系統獲得更多信息。沒有任何機制讓DLL報告加載失敗的原因。我建議你聯繫DLL的供應商並尋求支持。