GSe*_*erg 7 c# pinvoke dllnotfoundexception dllimport visual-studio-2008
我下载了zlib并将该库编译为Windows 32位和Windows 64位dll.我现在zlibwapi.dll和zlibwapi64.dll.
dll被复制到我的应用程序文件夹中,引用如下:
[DllImport(@"zlibwapi.dll", EntryPoint = "uncompress", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi, ExactSpelling = true, SetLastError = false)]
private static extern int uncompress32(
IntPtr dest,
ref uint destLen,
[In(), MarshalAs(UnmanagedType.LPArray)] byte[] source,
uint sourceLen
);
[DllImport(@"zlibwapi64.dll", EntryPoint = "uncompress", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi, ExactSpelling = true, SetLastError = false)]
private static extern int uncompress64(
IntPtr dest,
ref uint destLen,
[In(), MarshalAs(UnmanagedType.LPArray)] byte[] source,
uint sourceLen
);
Run Code Online (Sandbox Code Playgroud)
在运行时,我检查我是32位还是64位,并调用适当的版本.
如果我是32位,这可以正常工作,但64位版本给出
无法加载DLL"zlibwapi64.dll":找不到模块.(HRESULT例外:0x8007007E)
我在互联网上发现了许多类似的问题,建议的原因是该库依赖于其他一些库,而且可能找不到那些库.
这似乎不是这样的:
我试过设置64位dll的绝对路径,它没有帮助.
我如何使其工作?
Han*_*ant 12
这是一个相当基本的"文件未找到"类型的错误,遗憾的是它没有明确告诉你它找不到什么DLL.您已经了解了依赖DLL的问题.请注意,您可以通过使用/ MT编译代码来避免对msvcr90.dll的厌恶依赖
您需要调试问题,这需要深入了解它在寻找DLL的位置.一个很好的工具是SysInternals的ProcMon实用程序,它可以准确显示程序查找文件的位置.您应该看到它正在探测DLL,搜索PATH的目录并且无法找到该文件.
不幸的是,ProcMon有点健谈,并且习惯在数据中淹没你.一个更专用的工具是GFlags.exe,这是一个可从Debugging Tools for Windows软件包获得的工具.这些天包含在Windows SDK中.安装后,存储在c:\ program files(x86)\ windows\gflags.exe的调试工具中.您可以打开"显示加载程序快照"选项.在以后的Windows版本中,它告诉Windows加载程序在搜索DLL时生成调试消息.启用非托管调试时,它们将出现在"输出"窗口中.
首先尝试ProcMon,更容易开始.
当然,考虑纯粹的托管解决方案,这样您就不会遇到这些安装问题.好的是DotNetZip和SharpZipLib,他们的第一个谷歌热门.