无法加载 DLL 'mydll.dll':找不到指定的模块

4

在我的笔记本电脑上,我正在开发WPF应用程序,调试和启动.exe应用程序都没有问题。

我的应用程序使用本地DLL,为了解决引用问题,我将DLL添加到bin/debug(release)文件夹中。我使用DllImport像这样访问它:

[DllImport("xptodll.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int LDA_About();

当我试图在另一台电脑上运行.exe应用程序时,访问DLL时崩溃了。我创建一个句柄来记录任何未处理的异常,并出现以下错误:
无法加载DLL 'xptodll.dll':找不到指定的模块。HRESULT异常代码为0x8007007E。
bin/debug目录中有xptodll.dll和应用程序文件:.exe、.application、.exe.config、.exe.manifest和.pdb。
也许这很重要,xptodll.dll与硬件交互,但为什么它在两台机器上的行为不同?

你是在编译x86还是x64版本?你的笔记本电脑和其他电脑的操作系统位数是否不同?64位的可执行文件无法加载32位的DLL,而硬件接口DLL通常不会使用AnyCPU等管理和编写。 - Sean Hanley
1
你不能在另一台机器上获取DLL的调试版本,因为它没有可用的CRT调试版本。只部署发布版本,并部署所需的运行时DLL:http://www.microsoft.com/download/en/details.aspx?id=5555 - Hans Passant
我必须在每台安装应用程序的机器上安装vc++ 2010吗?为什么VisualStudio在创建设置项目时无法捕获该依赖关系?只能检测到.net依赖关系... - Cristóvão Macedo
2个回答

15

可能还有一些其他的依赖项导致失败。我猜测xptodll.dll本身依赖于其他缺失的库。 xptodll.dll的文档应该解释需要哪些依赖项。如果文档没有明确说明缺少什么,您可以使用Dependency Walker自行诊断问题。


2
缺少一个依赖项 IEShims.dll。现在将该dll复制到bin/debug文件夹中即可解决问题了吗? - Cristóvão Macedo
是的,在我将更多的4个Windows DLL文件放入.exe文件夹后,它似乎可以正确运行。这是解决方案吗?难道没有其他方法来修复这个问题吗? - Cristóvão Macedo
我认为您不应该随意复制Windows DLL文件到任何地方。我觉得您需要与DLL文件的供应商交谈,了解情况。 - David Heffernan
如果您使用MFC自己制作了DLL,则可能希望将其静态编译以避免需要MFC运行时库。 - Michael

3

除了“将DLL放在正确的位置”之外,另一个问题可能是,如果DLL是使用Visual Studio创建的,例如Visual Studio 2012,则还必须安装64位VCRedistributable(vcredist_x64.exe),这是由Visual Studio提供的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接