DLL 在应用程序代码运行之前被访问

问题描述 投票:0回答:2

我有一个 C# .NET 应用程序,我正在维护它并向其添加新功能。其中一项新功能需要使用第三方 DLL,该 DLL 在应用程序启动时可能并不总是存在。我添加了 DLL 作为对项目的引用以及用于检测 DLL 是否丢失的代码。在调用任何引用实际 DLL 的代码之前,该代码会通知用户缺少 DLL 文件。不幸的是,本机运行时中的某些内容甚至在 main() 运行并抛出异常之前就尝试访问 DLL。这是调试器的一些输出:

Your app has entered a break state, but no code is currently executing that is supported by the selected debug engine (e.g. only native runtime code is executing).

System.IO.FileNotFoundException: 'Could not load file or assembly 'FTD2XX_NET, Version=1.1.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified.' 

环境应该只按需访问程序集。由于 CLR 中的某些东西在 main() 运行之前抛出异常,因此应用程序甚至没有机会检查 DLL 是否存在。既然还没有运行任何应用程序代码,为什么要引用 DLL?

谁能提供一些关于本机运行时抛出此异常的原因以及如何避免的见解?据我所知,不再有延迟 DLL 加载的功能。是这样还是有秘密的方式仍然这样做?我会找到一种方法来捕获此异常,以便可以通知用户。提前感谢您提供任何信息。

有关系统的信息:

  • 窗口 10
  • .NET 框架 4.6.1
  • Visual Studio 2019
  • 我无法更新到较新版本的 .NET 或 Visual Studio。
c# .net windows dll
2个回答
0
投票

我建议阅读 Assembly.Load,也许 12 有帮助。


0
投票

当您从项目中引用 DLL 时,需要该 DLL 存在,否则您的应用程序将无法启动。 (正如您已经看到的那样。)您看到的“在应用程序代码运行之前访问 DLL”是本机代码,它会在您的托管代码开始执行之前尝试加载 DLL。 (在托管运行时开始之前。)

为了 有条件地 通过托管代码加载 DLL,(条件可能是 DLL 是否存在,或其他),您必须使用 System.Reflection.AssemblyLoad() 以动态加载 DLL在托管运行时期间。

© www.soinside.com 2019 - 2024. All rights reserved.