无法加载文件或程序集“***.dll”或其某个依赖项。

48

我有一个很久以前创建的dll,用于连接我开发的特定软件的数据库。多年来,我使用这个dll已经无数次并且从未出现过任何问题。

尝试部署我的最新应用时,出现以下错误:

System.IO.FileNotFoundException: Could not load file or assembly '***.dll' or one of its dependencies. The specified module could not be found.

所以,对于我编写的每个dll,我都会制作一个简单的窗体应用程序来测试该dll本身。运行该简单应用程序会产生相同的错误。该dll不加载或使用除System、System.Data和System.XML之外的任何其他内容。因此,就其依赖项而言,我没有看到任何问题。

顺便说一下,在开发站点上一切正常。问题仅限于部署站点。.Net和必要的可 redistributed 文件(由于我所有操作都是在C++中完成),已部署并正常工作。

运行FUSLOGVW.exe显示一切正常。

运行depends.exe时显示:警告:由于延迟加载依赖模块中缺少导出函数,至少有一个模块具有未解析的导入。

我已经尝试了重写整个事情。但结果还是一样。

有线索吗?

编辑

这里是完整的错误信息:

See the end of this message for details on invoking \"
just-in-time (JIT) debugging instead of this dialog box.\"

************** Exception Text **************\"
System.IO.FileNotFoundException: Could not load file or assembly 'connectionTo.dll' or one of its dependencies. The specified module could not be found.\"
File name: 'connectionToJobboss32.dll'\"
   at TESTConnection.Form1.button1_Click(Object sender, EventArgs e)\"
   at System.Windows.Forms.Control.OnClick(EventArgs e)\"
   at System.Windows.Forms.Button.OnClick(EventArgs e)\"
   at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)\"
   at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)\"
   at System.Windows.Forms.Control.WndProc(Message& m)\"
   at System.Windows.Forms.ButtonBase.WndProc(Message& m)\"
   at System.Windows.Forms.Button.WndProc(Message& m)\"
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)\"
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)\"
   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)\"
\"



************** Loaded Assemblies **************\"
mscorlib\"
    Assembly Version: 4.0.0.0\"
    Win32 Version: 4.0.30319.1 (RTMRel.030319-0100)\"
    CodeBase: file:///C:/Windows/Microsoft.NET/Framework/v4.0.30319/mscorlib.dll\"
----------------------------------------\"
TESTConnection\"
    Assembly Version: 1.0.3996.18980\"
    Win32 Version: \"
    CodeBase: file:///C:/Program%20Files%20(x86)/conn/TESTConnection.exe\"
----------------------------------------\"
System.Windows.Forms\"
    Assembly Version: 4.0.0.0\"
    Win32 Version: 4.0.30319.1 built by: RTMRel\"
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms/v4.0_4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll\"
----------------------------------------\"
System.Drawing\"
    Assembly Version: 4.0.0.0\"
    Win32 Version: 4.0.30319.1 built by: RTMRel\"
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Drawing/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll\"
----------------------------------------\"
System\"
    Assembly Version: 4.0.0.0\"
    Win32 Version: 4.0.30319.1 built by: RTMRel\"
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System/v4.0_4.0.0.0__b77a5c561934e089/System.dll\"
----------------------------------------\"

事件查看器中没有错误。

10个回答

41

或其依赖项之一

这是一个常见问题,使用Fuslogvw.exe无法找到缺失的非托管DLL。最好的方法是运行SysInternals的ProcMon工具。您会看到它在搜索DLL时找不到它。Dependency Walker中的Profile模式也可以显示它。


2
你能指导一下在 ProcMon 日志或者 Dependency Walker 中应该注意什么吗?我在这两个工具中都只看到了成功的信息。在 ProcMon 中,我确实看到了一些“文件未找到”的信息,但是它们紧接着就会在另一个路径中搜索同样的文件并且成功了。 - Dewm Solo
据我所知,您正在看正确的东西。令人失望的是,这通常是确保看到它的方法。除了淹没在数据中,我没有任何想法。如果您希望其他人查看它,可以保存跟踪并将其放在文件共享服务上。 - Hans Passant
2
将.NET项目设置中的“调试”选项卡中的“工作目录”字段设置为包含我程序所依赖的所有DLL的目录,解决了我的问题。 - MasterMastic
2
你可以使用 Telerik Just Decompile 来显示程序集(exe 或 dll)的依赖项。 - FindOutIslamNow

21

昨天我遇到了一个与dll有关的问题,它只参考了System、System.Data和System.Xml。结果发现平台类型的构建配置没有对齐。该dll是针对x86构建的,而使用它的程序是“任何CPU”,由于我正在运行的是x64机器,它以x64运行程序,并且与x86 dll存在问题。我不知道这是否是你的问题,但认为提及一下作为要检查的另一件事情。


由于我使用的是Managed C++,所以“Any CPU”不存在。无论如何,我仍然检查了配置管理器,dll和app都设置为Win32。由于我正在32位系统上构建此应用程序,因此我从Program Files(x86)文件夹中运行它,以避免与64位系统出现问题。...所以我一直在研究这个问题,但我没有发现任何错误。哦,我正在尝试部署的其中一台计算机是32位系统。 - Dewm Solo
遇到了类似的问题。我看了你的答案,但无法通过VS界面进行更改。所以我在文本编辑器中打开了项目文件,并手动将其更改为AnyCPU,然后它就可以工作了。即使是VS界面也首先接受了正确的值。 - Denis Besic

13

最近我遇到了这个问题,应用在开发者的机器和某些其他机器上可以正常运行,但是在新安装的机器上却无法运行。后来发现这是因为能够工作的机器已经安装了Visual C++ 11 Runtime,而新安装的机器上没有安装。 将Visual C++ 11 Runtime redistributable添加到应用程序安装程序中解决了这个问题...


3
请注意,Visual C++ 运行时有两个版本:32 位和64位。请安装这两个版本以确保正常运行。在我的情况下,只有64位的安装包解决了问题。 - kDar

6
我曾经遇到过同样的问题。对我来说,这是由于我机器上本地IIS服务器的默认设置引起的。所以解决方法很简单,就是使用内置的Visual Studio开发服务器即可 :)
在x64机器上,较新版本的IIS默认设置不允许32位应用程序运行。要在本地IIS中启用32位应用程序,请选择IIS管理器中的相关应用程序池,点击“高级设置”,并将“启用32位应用程序”从False更改为True。

6

我最近遇到过这个问题。原来旧的DLL文件是使用之前版本(Visual Studio 2008)编译的,并且引用了该版本的动态运行时库。我尝试在只安装了.NET 4.0的系统上运行它,但从未安装过任何动态运行时库。解决方案是重新编译DLL以链接静态运行时库。

检查应用程序错误日志在事件查看器(EVENTVWR.EXE)中的内容。它会提供更多关于错误的信息,并可能指向问题的真正原因。


我查看了事件查看器并完整地发布了我得到的错误消息。事件查看器中没有显示任何内容。 - Dewm Solo
1
你说在开发机上运行正常,但在部署机器上却不行。你是在部署调试版本的DLL,并且在部署机器上没有调试库吗?在搜索路径中是否有其他版本的connectionTo.dll或connectionToJobboss32.dll? - Jim Mischel
我尝试了它的调试版本和发布版本,但都出现了相同的错误。我曾经遇到过MSVCR100.dll缺失的错误,这是用MS VC++制作应用程序所需的可再发行库,但现在我已经将其与应用程序一起复制了。当复制调试版本时,我还将其替换为MSVCR100d.dll。 - Dewm Solo
解决方案是什么?我重新编译了DLL以链接静态运行时库。这是否意味着您在VS 2010中重新编译了原始的VS 2008 DLL?我不明白。谢谢。 - Kevin Meredith

2
我遇到了相同的问题——一个.dll文件一直在工作,但我的电脑崩溃后,我就出现了“无法加载文件或程序集....dll”的问题。
有两种可能的解决方案:当电脑崩溃时,可能存在一些不一致的文件。
C:\Users\<yourUserName>\AppData\Local\Temp\Temporary ASP.NET Files

删除该文件夹,重新编译后错误就消失了。

有一次我还不得不删除我的packages文件夹(我在其他地方读到过)。允许Visual Studio/nuget安装缺失的包(或手动重新安装),之后一切都恢复正常了。


2

这个回答与提问者的情况完全无关,对于其他人来说也是一个非常不可能的情况,但以防万一可能会有所帮助...

在我的情况下,我遇到了“无法加载文件或程序集'System.Windows.Forms,Version=4.0.0.0 ...”,因为我使用了来自.Net Framework / SDK版本2的ILDAsm.exe和ILAsm.exe对程序进行了反汇编和重新组合。切换到.Net Framework / SDK版本4的ILDAsm.exe和ILAsm.exe解决了问题。

(奇怪的是,尽管我所做的事情可能看起来像是一个明显的错误,但用JetBrains dotPeek检查时,未能工作的EXE文件确实表明它针对.Net 4目标。)


1

我曾经遇到同样的问题,通过确保解决方案中的项目具有相同的配置和平台(在我的情况下是Debug x64),我解决了这个问题。不知何故,部分项目缺少Visual Studio的x64设置,因此我手动编辑了.sln文件(将正确构建的项目的配置和平台复制到需要的项目中)。以下是其中一个项目的示例:

{1BA29980-EE5D-4476-AFFC-0F177B6C9865}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1BA29980-EE5D-4476-AFFC-0F177B6C9865}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1BA29980-EE5D-4476-AFFC-0F177B6C9865}.Debug|x64.ActiveCfg = Debug|x64
{1BA29980-EE5D-4476-AFFC-0F177B6C9865}.Debug|x64.Build.0 = Debug|x64
{1BA29980-EE5D-4476-AFFC-0F177B6C9865}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1BA29980-EE5D-4476-AFFC-0F177B6C9865}.Release|Any CPU.Build.0 = Release|Any CPU
{1BA29980-EE5D-4476-AFFC-0F177B6C9865}.Release|x64.ActiveCfg = Release|x64
{1BA29980-EE5D-4476-AFFC-0F177B6C9865}.Release|x64.Build.0 = Release|x64

但是,对于一个依赖项中包含Java文件(*.jar)的项目,出现了相同的错误。我不得不手动编辑环境变量,创建一个记录,其中包含以下值:

C:\Program Files\Java\jre1.8.0_171\bin\server

并将其置于路径项目的顶部。

这解决了问题,直到我在计算机上更新了Java。我必须编辑环境变量中的版本号,以匹配更新后的文件夹名称。

C:\Program Files\Java\jre1.8.0_181\bin\server


1

确定本地DLL依赖关系的更简单方法是使用Dependency Walker - http://www.dependencywalker.com/

我分析了本地DLL并发现它依赖于MSVCR120.DLL和MSVCP120.DLL,这两个文件都未安装在我的系统32目录中的预备服务器上。我在预备服务器上安装了C++运行时库,问题得到解决。


谢谢,你救了我的一天。使用该工具找到了缺失的库MSVCR100.DLL和MSVCP100.DLL,然后安装了Microsoft Visual C++ 2010 Redistributable Package (x64),问题得到解决。 - Manuel Ferreiro

0

1) 从“Externals\ffmpeg\bin”复制DLL到您的项目输出目录(可执行文件所在的位置); 2) 确保您的项目是针对x86目标构建的(以32位模式运行)。

点击此处查看更多信息


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