【问题标题】:DotNet Console application crashes with a message "FileNotFoundException". Though the dll is present and getting loadedDotNet 控制台应用程序崩溃并显示消息“FileNotFoundException”。虽然 dll 存在并且正在加载
【发布时间】:2017-10-03 20:23:57
【问题描述】:

我有一个简单的控制台应用程序,它使用第三方 dll(32 位)(它依赖于另外两个 dll,复制到同一路径)和 dotnet 框架 4.5。此应用程序适用于本地 Windows 7 机器。但是在 windows server 2012 R2 中运行时同样会崩溃并显示以下消息。

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

来自事件查看器:

Faulting application name: ConsoleApplication2.exe, version: 1.0.0.0, time stamp: 0x590c51de
Faulting module name: KERNELBASE.dll, version: 6.3.9600.18340, time stamp: 0x5736541b
Exception code: 0xe0434352
Fault offset: 0x00014878
Faulting process id: 0x9a4
Faulting application start time: 0x01d2c5898c929ee7
Faulting application path: C:\Debug\ConsoleApplication2.exe
Faulting module path: C:\Windows\SYSTEM32\KERNELBASE.dll
Report Id: ca4bbc88-317c-11e7-818e-0ac916d6c5ab
Faulting package full name: 
Faulting package-relative application ID: 

错误消息日志会记录以下消息,尽管所有三个 dll 都在同一个位置。

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

我尝试使用 x86 编译应用程序,这很有帮助。

任何有关如何找到根本原因\是什么导致 dcasdk dll 加载失败的帮助......都会有所帮助。


融合日志

Fusion 日志显示加载成功。尽管应用程序崩溃,但与任何其他 dll 相关的融合日志中没有错误。

=== Pre-bind state information ===
LOG: DisplayName = dcasdk, Version=1.0.1.0, Culture=neutral, PublicKeyToken=null
 (Fully-specified)
LOG: Appbase = file:///C:/Debug/
LOG: Initial PrivatePath = NULL
LOG: Dynamic Base = NULL
LOG: Cache Base = NULL
LOG: AppName = ConsoleApplication2.exe
Calling assembly : ConsoleApplication2, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null.
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: C:\Debug\ConsoleApplication2.exe.Config
LOG: Using host configuration file: 
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config.
LOG: Policy not being applied to reference at this time (private, custom, partial, or location-based assembly bind).
LOG: Attempting download of new URL file:///C:/Debug/dcasdk.DLL.
LOG: Assembly download was successful. Attempting setup of file: C:\Debug\dcasdk.dll
LOG: Entering run-from-source setup phase.
LOG: Assembly Name is: dcasdk, Version=1.0.1.0, Culture=neutral, PublicKeyToken=null
LOG: Binding succeeds. Returns assembly from C:\Debug\dcasdk.dll.
LOG: Assembly is loaded in default load context.

Dependency walker 将这些 dll 显示为缺失。

API-MS-WIN-CORE-WINRT-ERROR-L1-1-0.DLL
API-MS-WIN-CORE-WINRT-L1-1-0.DLL
API-MS-WIN-CORE-WINRT-ROBUFFER-L1-1-0.DLL
API-MS-WIN-CORE-WINRT-STRING-L1-1-0.DLL
DCOMP.DLL
IESHIMS.DLL

【问题讨论】:

  • dcasdk.dll在哪里?
  • 我认为关键是“或其依赖项之一”部分。 dcasdk.dll 所依赖的 DLL 是否不存在?
  • dcasdk.dll 位于“C:\Debug”文件夹中。此 dll 依赖于同样存在于同一文件夹中的另外两个 dll。相同的应用程序在本地(Windows7)中运行良好,并在 Windows Server 2012 R2 上运行的部署机器中出现错误。我尝试使用依赖 walker 来查找它试图加载 dll 的位置。但是我无法从该工具中获得任何有用的信息。 Fusion 日志显示 dll 正在加载。

标签: c# .net windows console-application .net-4.5


【解决方案1】:

安装 MIcrosoft Visual C++ redistributable package(x86) 解决了这个问题。 依赖步行者具有误导性。我能够使用 Process Monitor 工具找到根本原因。

谢谢。

【讨论】:

【解决方案2】:

我没有足够的代表来发布 cmets,但这可能与 BadImageFormatException Could not load file or assembly or one of its dependencies. An attempt was made to load a program with an incorrect format 重复

在仅定位x86 之前,您的平台目标是AnyCPU 吗?另外,dcasdk.dll 你确定它也针对AnyCPU 并且不是针对特定平台的吗?

【讨论】:

  • 是的,这个问题和你提到的那个有关。当我添加了两个 dcasdk 所依赖的 dll 并选择了具有 prefer32bit 开启的任何 CPU 时,它在本地运行良好。这个问题发生在部署机器(Windows server 2012 R2)中,我尝试了 Any CPU(有和没有 Prefer 32bit),x86 但没有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-25
  • 1970-01-01
  • 1970-01-01
  • 2013-02-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多