无法加载文件或程序集“***.dll”或其依赖项之一
Posted
技术标签:
【中文标题】无法加载文件或程序集“***.dll”或其依赖项之一【英文标题】:Could not load file or assembly '***.dll' or one of its dependencies 【发布时间】:2011-05-23 14:23:30 【问题描述】:我有这个我很久以前创建的 dll 并用于连接到我开发的特定软件的数据库。 4 年多来我没有遇到任何问题,并且使用此 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 和必要的可再发行组件,因为我在 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\"
----------------------------------------\"
事件查看器中没有错误。
【问题讨论】:
【参考方案1】:昨天我在一个 dll 上遇到了同样的问题,它引用的只是 System、System.Data 和 System.Xml。原来平台类型的构建配置没有对齐。该 dll 是为 x86 构建的,使用它的程序是“任何 CPU”,由于我运行的是 x64 机器,它以 x64 运行程序,并且 x86 dll 存在问题。我不知道这是否是您的问题,只是想我会提到它作为其他检查。
【讨论】:
自从我用托管 C++ 编写以来,“任何 CPU”都不存在。无论如何,我检查了配置管理器,并且 dll 和 app 都设置为 Win32。由于我以 32 位构建它,因此我从 Program Files (x86) 文件夹中运行它,以避免出现 64 位问题。 ...所以我一直在研究这个,但我没有发现任何问题。哦,我尝试部署的站点之一是 32 位机器。 有类似的问题。我阅读了您的答案,无法使用 VS 界面更改它。所以我在文本编辑器中打开项目文件并手动将其更改为 AnyCPU,它可以工作。甚至 VS 接口也接受了它应该放在首位的价值。【参考方案2】:我最近遇到了这个问题。事实证明,旧 DLL 是使用以前的版本 (Visual Studio 2008) 编译的,并且正在引用该版本的动态运行时库。我试图在一个只有 .NET 4.0 的系统上运行它,而且我从未安装过任何动态运行时库。解决方案?我重新编译了 DLL 以链接静态运行时库。
在事件查看器 (EVENTVWR.EXE) 中检查您的应用程序错误日志。它将为您提供有关错误的更多信息,并可能会指出问题的真正原因。
【讨论】:
我查看了事件查看器并发布了我完全收到的错误消息。事件查看器中没有显示任何内容。 你说它可以在开发机器上工作,但不能在部署机器上工作。您是否正在部署 dll 的调试版本并且部署机器上没有调试库?搜索路径中的某处是否有其他版本的 connectionTo.dll 或 connectionToJobboss32.dll? 我尝试了它的调试和发布版本。都有相同的错误。我曾经得到 MSVCR100.dll 丢失错误。这是使用 MS VC++ 制作的应用程序的可再发行库,但我现在确实将它与应用程序一起复制。在复制调试版本时,我也将其替换为 MSVCR100d.dll。 "解决方案?我重新编译了 DLL 以链接静态运行时库。"这是否意味着您在 VS 2010 中重新编译了原始的 VS 2008 DLL?我不明白。谢谢【参考方案3】:或其依赖项之一
这是常见的问题,您无法通过 Fuslogvw.exe 看到丢失的非托管 DLL。最好的办法是运行 SysInternals 的 ProcMon 实用程序。您会看到它正在搜索 DLL 而找不到它。 Dependency Walker 中的 Profile 模式也可以显示。
【讨论】:
您能否指出在 ProcMon 日志甚至 Dependency Walker 中要查找的内容?老实说,我只看到两种实用程序的成功。在 ProcMon 中,我确实看到了一些“找不到文件”,但紧随其后的是在另一个路径中搜索同一文件并成功。 您正在寻找正确的事情。令人失望的是,这通常是一种肯定的方式来看待它。不知道,除了淹没在数据中。如果您想另眼相看,可以保存跟踪并将其放在文件共享服务上。 将 .NET 项目设置(Debug
选项卡)中的 Working Directory
字段设置到包含我的程序所依赖的所有 DLL 的目录,为我解决了这个问题。
您可以使用Telerik Just Decompile
显示程序集(exe 或dll)的依赖关系【参考方案4】:
我遇到了同样的问题。对我来说,这是由我机器上本地 IIS 服务器的默认设置引起的。所以修复它的简单方法是使用内置的 Visual Studio 开发服务器 :)
x64 机器上较新的 IIS 版本有一个设置,默认情况下不允许运行 32 位应用程序。要在本地 IIS 中启用 32 位应用程序,请在 IIS 管理器中选择相关的应用程序池,单击“高级设置”,将“启用 32 位应用程序”从 False 更改为 True
【讨论】:
【参考方案5】:这个答案与 OP 的情况完全无关,对其他人来说也是极不可能的情况,但以防万一它可能对某人有所帮助......
在我的情况下,我收到“无法加载文件或程序集 'System.Windows.Forms, Version=4.0.0.0 ...”,因为我使用 ILDAsm.exe 和 ILAsm.exe 从 . Net Framework / SDK 版本 2。从 .Net Framework / SDK 版本 4 切换到 ILDAsm.exe 和 ILAsm.exe 解决了该问题。
(奇怪的是,即使我所做的事情看起来像是一个明显的错误,但生成的无法运行的 EXE 文件在使用 JetBrains dotPeek 检查时确实表明它针对的是 .Net 4。)
【讨论】:
【参考方案6】:我最近遇到了这个问题,该应用程序可以在开发人员机器上正常运行并选择其他机器,但不能在最近安装的机器上运行。事实证明,它运行的机器安装了 Visual C++ 11 运行时,而新安装的机器没有。 将可再发行的 Visual C++ 11 运行时添加到应用安装程序修复了问题...
【讨论】:
请注意,Visual C++ 运行时有 2 个版本:32 位和 64 位。确保安装它们。在我的情况下,只有 64 位包解决了这个问题。【参考方案7】:1) 将 DLL 从“Externals\ffmpeg\bin”复制到项目的输出目录(可执行文件所在的位置); 2) 确保您的项目是为 x86 目标构建的(在 32 位模式下运行)。
Follow this thread for more
【讨论】:
【参考方案8】:确定本机 DLL 具有哪些依赖项的更简单方法是使用 Dependency Walker - http://www.dependencywalker.com/
我分析了本机 DLL,发现它依赖于 MSVCR120.DLL 和 MSVCP120.DLL,这两者都没有安装在我的暂存服务器上的 System32 目录中。我在登台服务器上安装了 C++ 运行时,问题得到解决。
【讨论】:
谢谢,你拯救了我的一天。使用该工具查找丢失的库MSVCR100.DLL和MSVCP100.DLL,然后安装Microsoft Visual C++ 2010 Redistributable Package (x64)并修复问题。【参考方案9】:我遇到了同样的问题 - 一个 .dll 一直在工作,然后我的计算机崩溃了,之后我遇到了“无法加载文件或程序集 ....dll”的问题
两种可能的解决方案:当计算机崩溃时,可能存在一些不一致的文件
C:\Users\<yourUserName>\AppData\Local\Temp\Temporary ASP.NET Files
删除那个文件夹,重新编译,错误就消失了。
曾经我还必须删除我的包文件夹(我在其他地方读过)。允许 Visual Studio / nuget 安装丢失的包(或手动重新安装),然后一切都很好。
【讨论】:
【参考方案10】:遇到了同样的问题,并通过确保解决方案中的项目具有相同的配置和平台(在我的情况下是 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的路径,并将其放在Path项的顶部。
这解决了这个问题,直到我在我的机器上更新了 Java。我必须在环境变量中编辑版本号以匹配更新的文件夹名称。
C:\Program Files\Java\jre1.8.0_181\bin\server
【讨论】:
以上是关于无法加载文件或程序集“***.dll”或其依赖项之一的主要内容,如果未能解决你的问题,请参考以下文章
无法加载文件或程序集“Oracle.ManagedDataAccessDTC.DLL”或其依赖项之一
CefSharp - 无法加载文件或程序集“CefSharp.Core.dll”或其依赖项之一
IBM DB2 问题--System.BadImageFormatException:无法加载文件或程序集 IBM.DB2.DLL 或其依赖项之一