DllNotFoundException: 無法加載 DLL 'B.dll':找不到指定的模塊。MSVCR90.dll 等),補上後仍報錯。bin/Debug 統一輸出,路徑無問題。// B.dll 內部
MyStruct* p = nullptr; // 忘記 new/malloc
p->member = 123; // 這裡崩潰
DLL 內部運行時崩潰(空指針、越界、除零等)會被 Windows 加載器轉換為「模塊未找到」錯誤碼。這是因為加載器在 DllMain 或靜態初始化階段捕獲到異常,認為模塊初始化失敗,隨即卸載並返回 ERROR_MOD_NOT_FOUND。
| 步驟 | 工具/方法 |
|---|---|
| 1. 確認 DLL 及依賴在同目錄 | 輸出路徑、PATH 環境變量、SetDllDirectory |
| 2. 用 Dependency Walker / dumpbin /depends.exe 看真實依賴 | 關注紅色「缺失」且非系統已知延遲加載項 |
| 3. **啟用非托管調試** | VS 屬性 → Debug → Enable unmanaged code debugging,斷點進入 C++ 捕獲真實崩潰點 |
| 4. 編寫極簡 C++ 測試 EXE 調用同 DLL | 隔離 C# 互操作層,驗證 DLL 自身穩定性 |
| 5. 檢查 DllMain / 全局對象構造函數 | 禁止在其中做複雜操作、分配內存、調用 LoadLibrary |
extern "C" __declspec(dllexport)**,避免名字修飾。GetLastError 風格的錯誤碼獲取函數,便於 C# 端 Marshal.GetLastWin32Error() 診斷。遇到「找不到 DLL」但文件明明在,**優先懷疑 DLL 內部初始化/導出函數邏輯崩潰**。開啟非托管調試、寫原生測試宿主,定位真實崩潰行,而非盲目補系統 DLL。