我必须在这里遗漏一些东西;疯了..我正在使用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)
答案 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”以确保所有依赖项都已满足?