非托管DLL未加载DLLImport C#

时间:2013-11-25 21:26:02

标签: c# dll

我必须在这里遗漏一些东西;疯了..我正在使用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)

2 个答案:

答案 0 :(得分:2)

框架调用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。这样一来,如果是操作系统   加载程序遇到访问冲突(例外C0000005)   映射指定的DLL文件映像或执行启动代码,   加载器将最后一个错误设置为998(ERROR_NOACCESS)和   LoadLibrary()函数将失败,返回值为NULL。回到   顶部|提供反馈

     

更多信息

     

当启动代码中的任何地方发生访问冲突时,   异常调度程序检测是否遇到此进程   正在调试异常。如果是这样,这第一次机会异常就是   发送到调试器。

     

要解决LoadLibrary()失败问题,请运行a下的应用程序   调试器并为C0000005启用第一次机会异常处理   访问违规例外。如果发生访问冲突时   调用LoadLibrary()函数,应用程序将进入   调试器。然后可以使用调试器的调用堆栈来跟踪位置   发生了异常。堆栈跟踪应该可以帮助您缩小范围   与遇到的异常有关的实际问题。

     

有关如何启用第一次机会异常处理的信息   C0000005访问冲突异常,请参阅调试器   文档。

实质上,您的DLL在其启动代码中产生访问冲突。很多事情都可能导致这种情况,你需要对DLL进行一些调试。我建议您尝试从本机C ++主机进行调试。以这种方式调试DLL可能会更容易。

顺便说一句,你的函数使用cdecl调用约定,一旦超过当前的障碍,你需要修改你的C#p / invoke来指定CallingConvention.Cdecl

答案 1 :(得分:0)

假设您已经看过this link

您是否使用depends.exe打开了“foo.dll”以确保所有依赖项都已满足?