簡體   English   中英

非托管DLL未加載DLLImport C#

[英]Unmanaged DLL is not loading with DLLImport C#

我必須在這里遺漏一些東西; 瘋了..我正在使用VS2010 C#,用C#開發一個Windows Form應用程序。 在同一個解決方案中,我有一個c ++ dll項目,它將它的DLL輸出到與C#可執行文件相同的“/ bin /”文件夾。 我正在看文件夾,文件肯定在那里。 我甚至使用以下內容確保它在運行時存在:

// yep.. it's there...
string s = System.IO.Directory.GetCurrentDirectory() + @"\Foo.dll";
System.Diagnostics.Debug.Assert(System.IO.File.Exists(s));

我的DLL有這個:

extern "C" __declspec(dllexport) int test_func();

我使用DLL explorer實用程序確認其中包含正確的名稱。 該函數本身除了“返回4”之外什么都不做

C#代碼是:

[DllImport("Foo.dll")]
private static extern int test_func();

我收到此錯誤:

.exe中出現未處理的“System.DllNotFoundException”類型異常

附加信息:無法加載DLL'Foo.dll':無效訪問內存位置。 (HRESULT異常:0x800703E6)

框架調用LoadLibrary時發生錯誤。 這可以從錯誤消息中推斷出來:

無法加載DLL'Foo.dll'

報告的錯誤代碼是包含Win32錯誤代碼998(即ERROR_NOACCESS )的COM錯誤代碼。 導致調用LoadLibrary拋出ERROR_NOACCESS的方案在此處描述: http//support.microsoft.com/kb/196069

症狀

在嘗試將指定模塊映射到調用進程的地址空間時,LoadLibrary()API有時可能會遇到訪問沖突。 在這種情況下,LoadLibrary()返回NULL值,GetLastError()返回錯誤代碼998(ERROR_NOACCESS)。 回到頂端| 給予反饋

原因

Windows NT狀態代碼STATUS_ACCESS_VIOLATION映射到Win32錯誤代碼ERROR_NOACCESS。 因此,如果操作系統加載程序在映射指定的DLL文件映像或執行啟動代碼時遇到訪問沖突(例外C0000005),則加載程序將最后一個錯誤設置為998(ERROR_NOACCESS)並且LoadLibrary()函數將失敗返回值為NULL。 回到頂端| 給予反饋

更多信息

當啟動代碼中的任何位置發生訪問沖突時,異常調度程序會檢測是否正在調試遇到此異常的進程。 如果是這樣,則將第一次機會異常發送到調試器。

要解決LoadLibrary()失敗問題,請在調試器下運行該應用程序,並為C0000005訪問沖突異常啟用第一次機會異常處理。 如果在調用LoadLibrary()函數時發生訪問沖突,則應用程序將進入調試器。 然后可以使用調試器的調用堆棧來跟蹤發生異常的位置。 堆棧跟蹤應該可以幫助您縮小與遇到的異常相關的實際問題。

有關如何為C0000005訪問沖突異常啟用第一次機會異常處理的信息,請參閱調試器文檔。

實質上,您的DLL在其啟動代碼中產生訪問沖突。 很多事情都可能導致這種情況,你需要對DLL進行一些調試。 我建議您嘗試從本機C ++主機進行調試。 以這種方式調試DLL可能會更容易。

cdecl一下,你的函數使用cdecl調用約定,一旦你超越當前的障礙,你需要修改你的C#p / invoke來指定CallingConvention.Cdecl

假設您已經看過此鏈接

您是否使用depends.exe打開“foo.dll”以確保您滿足所有依賴項?

暫無
暫無

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

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