C#应用程序无法在另一台计算机上启动。

3
当我尝试在不同于开发计算机上启动我的C#应用程序时,出现以下错误消息:
System.IO.FileLoadException: 无法加载文件或程序集“Widgets3D,Version = 1.0.3511.25568,Culture = neutral,PublicKeyToken = null”或其某一个依赖项。此应用程序无法启动,因为应用程序配置不正确。重新安装该应用程序可能会解决此问题。 (HRESULT的异常:0x800736B1)
文件名:“Widgets3D,Version = 1.0.3511.25568,Culture = neutral,PublicKeyToken = null”---> System.Runtime.InteropServices.COMException(0x800736B1):此应用程序无法启动,因为应用程序配置不正确。重新安装该应用程序可能会解决此问题。 (HRESULT的异常:0x800736B1)
我使用了Dependency Walker和Process Monitor进行了检查,但找不到任何缺少的DLL。特别是在错误中提到的Widgets3D.dll已经存在!
两台计算机都更新到最新的XP服务包和更新。该应用程序在很多台PC上运行正常。只有这一台计算机出现了问题。
编辑:
如建议所述,我尝试regsvr32缺少的dll,但是出现以下错误:
LoadLibrary("./Widgets3D.dll") failed - This application has failed to start because the application configuration is incorrect. Reinstalling the application may fix this problem.
谢谢!

我猜Widgets3D是一个依赖于其他dlls/components的第三方库/组件。我相信你有这个组件的安装程序。你能运行这个安装程序,然后再试着运行你的应用程序吗? - Kirtan
没有Widgets3D库,这是我自己的;但是这个库依赖于其他第三方库(准确来说是Ogre3D引擎),所有来自Ogre的dll文件都在同一个目录中。 - clamp
它们是否使用 regsvr32 注册? - Kirtan
当我尝试注册它们时,我收到以下错误提示:"OgreMain.dll已加载,但未找到DllRegisterServer入口点。无法注册此文件。" - clamp
7个回答

2

读取该异常信息,以下是重要部分:

System.Runtime.InteropServices.COMException

这不是一个 .Net 程序集。它是一个 COM dll,需要注册。


谢谢。你所说的“registered”具体是什么意思?是的,这个 DLL 是一个 CPP 库。 - clamp
请参考Preet的答案来完成它。 - Joel Coehoorn

2
widgets3d需要安装吗?在另一台机器上尝试使用Regsvr32进行安装。
只需打开命令窗口并运行:
Regsvr32.exe path-to-your-widgets3d.dll

请再试一次。

您的“load library”错误似乎表明目标计算机上可能没有注册3D库所需的其他相关dll。请在该计算机上运行3D库的安装程序。

还请查看此帖子


谢谢,但是很抱歉我不明白你所说的regsrvr32是什么意思?widgets3d.dll是一个C++库。 - clamp
这是一个C++库,但是它通过COM公开,因此您需要运行上面答案中解释的命令。你试过了吗? - Armbrat
是的,我做了。请看我的编辑以获取错误信息。Widgets3D.dll使用的第三方库是ogre3d。但这一直在工作。所有的ogre dll都已经就位。 - clamp

1

如果您感兴趣的话,我们已经找到了解决问题的方法,那就是最近发布的VC KB971090安全补丁。

卸载此补丁并重新构建DLL可以解决此问题。

关于此问题有很多讨论: https://stackoverflow.com/search?q=KB971090


1

卸载是解决问题的一种方法,但如果您有一个易受攻击的ATL组件,您肯定希望安装安全补丁并对应用程序进行必要的更改以利用安全修复。

我处理这个问题的方式是开发一种解决方法,允许安装补丁但仍然针对旧版本的DLL进行构建。 我在这里描述了这个解决方案。


1
我使用了依赖项查看器和进程监视器,但没有找到任何缺失的DLL文件。
不需要这样做。只需转到“开始 -> 运行 -> regsvr32 <Widgets3D.dll路径>\Widgets3D.dll -> 按Enter键”。
完成!

1

Widgets3D.dll 可能依赖于 C++ 运行时库。请获取与编译器相应的“Visual C++ Redistributable”并在目标系统上运行。您无法从 Microsoft 下载调试 DLL,因此希望它是在发布配置中构建的。


谢谢!我尝试安装vcredist_x86.exe用于VS2005,但仍然收到与之前相同的错误消息。 - clamp
就像我说的那样,请确保它不是在Debug模式下构建的。此外,检查Administrative Tools中的系统事件日志;有时您可以在那里获得更有意义的错误文本。 - ChrisV

1

啊,DLL地狱我想。尝试注销它并重新注册可能会有帮助。如果它最近已经移动过,则必须先重新定位才能注销再重新注册。我在使用COM DLL时经常遇到这种情况。

希望能有所帮助。


1
谢谢,但即使我尝试注销它,我仍然会收到这个错误消息:LoadLibrary("Widgets3D.dll")失败 - 此应用程序无法启动,因为应用程序配置不正确。重新安装该应用程序可能会解决此问题。 - clamp

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