簡體   English   中英

C ++ DLL無法在某些計算機上加載

[英]C++ DLL fails to load on some machines

我試圖弄清楚為什么我的DLL無法在某些計算機上加載的原因。

我的應用程序:

使用setup.msi安裝程序部署的AC#程序。 安裝程序內部是放置在應用程序的安裝目錄中的DLL。 例如:

OUTDIR = c:\Program Files\MyApplicationName\%OUTDIR%\MyApplication.exe
dir %OUTDIR%\DLL_FOLDER\\*.dll 

myDLL.dll

C#應用程序調用由以下指定的LoadLibrary:

[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr LoadLibrary(string libname);   

所以基本上

intPtr dll_handle = LoadLibrary("myDll.dll");

被調用,我們使用dll_handle調用所需的函數。

到目前為止,這已經在我部署的5/7機器上起作用了……我在這里犯的明顯錯誤是什么? :-)

感謝您的幫助!

最可能的解釋是:

  1. 找不到DLL。 由於您未指定完整路徑,因此需要依靠動態鏈接庫搜索順序來找到它。 將DLL與可執行文件放在同一目錄中是確保您可以找到它並找到正確版本的常用方法。
  2. DLL具有不匹配的位。 例如,您有一個64位進程和一個32位DLL,反之亦然。
  3. 找到了DLL,並且具有正確的位數,但是無法解析DLL的依賴項。 通常,這意味着需要在目標計算機上安裝適當的MSVC運行時。

診斷的第一步是檢查LoadLibrary的返回值,如果返回值為NULL則調用GetLastError檢索錯誤代碼。 在p / invoke中,您可以這樣進行:

IntPtr lib = LoadLibrary(...);
if (lib == IntPtr.Zero)
    throw new Win32Exception();

您可以使用Dependency Walker之類的工具來進一步調試問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM