System.DllNotFoundException: 在Windows 2003上无法加载DLL

11

我在我的C#项目中使用了一个C++ DLL,在我的Windows XP机器上运行良好,但是当我将我的调试项目复制到Windows 2003服务器(x64)时,我收到以下错误,请问有谁能告诉我这是什么问题,以及如何解决它。

谢谢

"System.DllNotFoundException: 无法加载DLL 'lib.dll':由于应用程序配置不正确,此应用程序未能启动。重新安装该应用程序可能会解决此问题"


应用程序目录中是否存在 lib.dll - leppie
是的,是这样,但错误仍然出现...有人知道如何修复吗?我感到非常沮丧... - Rick
1
lib.dll也是在debug模式下构建的吗?如果是,它可能会尝试链接到调试版本的C++运行时库,如果Windows 2003机器上没有安装Visual Studio,则无法安装。 - shf301
1
@shf301:思维敏捷,这个问题也曾经困扰过我太多次了 :) - leppie
我没有lib.dll的源代码..我的项目会在点击调试时将lib.dll复制到debug文件夹中。 - Rick
5个回答

14
它抱怨在定位CRT dlls时遇到了麻烦。首先检查DLL是否包含所需的清单(manifest)。在Visual Studio中,选择“文件”+“打开”+“文件”,选择DLL并验证其是否包含RT_MANIFEST节点。下一个问题是你不能部署调试版本的DLL。它将依赖于CRT的调试版本,而你无法在目标机器上安装该版本。
要么部署Release版本的DLL,要么使用/MT选项编译DLL,以便静态链接CRT。项目+属性,C / C ++,代码生成,运行库。如果使用/clr选项编译DLL,则此方法无效。

7
针对DLL加载问题,我建议您使用Dependency Walker工具。在处理此类问题时,该工具已被证明非常有价值,因为它将向您显示确切的问题。
如果您拥有Visual Studio 2005,则可以在C:\Program Files\Microsoft Visual Studio 8\Common7\Tools\Bin\depends.exe中找到它。
更新: MSVCR90D.DLL是Visual C++运行时9.0的调试版本。它应仅用于调试目的。我强烈建议构建库的发布版本,以避免DLL加载问题。但是,如果您绝对需要部署调试版本,则可以在C:\Program Files\Microsoft Visual Studio 9.0\VC\redist\Debug_NonRedist\x86中找到所有所需的DLL。

谢谢!你的回答帮了我很大的忙。Dependency Walker 直接找到了问题的根源。 - vfilby
这就是解决方法。我在Unity3D中苦苦挣扎了一周。 - The Lazy Coder

4

听起来你没有在目标机器上安装Visual C++运行库。你可以从这里安装它。由于似乎正在使用那些dll的调试版本,也许您需要先以发布模式构建您的应用程序?这篇文章这篇文章还有其他一些建议可能会有所帮助...


3

lib.dll是32位的DLL吗?您的C#程序将在x64上本地运行,但无法加载32位的DLL。您可以尝试将C#项目的目标CPU更改为“x86”,以便强制其在WOW64下运行。


0
我发现当操作系统需要更新时,一些dll文件会被冻结。 简单地检查待处理的更新,安装它们和/或重新启动Windows即可。 之后,这些被冻结的dll文件就会被释放,问题也就解决了。

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