我有第三方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#網站中工作嗎?
謝謝
你爲什麼使用'SetLastError = true'?你爲什麼使用'CharSet.Ansi'? –
我不確定'SetLastError = true',但VB示例代碼將該調用定義爲'Declare Ansi Function GetVersion Lib「ThirdPartyAPI.dll」()As Integer',並且該代碼有效。 – mooncat69
該函數沒有文本參數,所以charset是無關緊要的 –