如何尝试捕获程序集未找到错误

10

好的,假设我有一个类似这样的应用程序:

using System;
using AliensExist; // some DLL which can't be found...

我希望的是,如果程序集DLL AlienExist无法找到,应用程序不会返回错误,而是被“trycatched”(类似于捕获异常)...
using System;
try{
using AliensExist; // some DLL which can't be found...
} catch {}

如何实现?我知道使用关键字不能稍后使用...但现在我太懒了,不想测试。
非常感谢!

3
我想,代码必须先编译才行,对吧? - ChaosPandion
1
首先,using 不指定 dll。它指定了使用的命名空间,该命名空间可以在多个程序集(dll)中定义。 - Ladislav Mrnka
using语句不会添加对另一个程序集的引用,是您项目构建选项完成该操作。许多程序集包含与程序集同名的命名空间只是一个干扰项。 - Ben Voigt
是JIT编译器引起了异常。当它尝试为缺失程序集中的类型生成代码时会发生这种情况。这需要从程序集中读取元数据,而这会导致崩溃。至少对于Microsoft Jitter来说,您需要提前一个方法调用来捕获异常。对于Mono来说,要早得多。您还需要使用[MethodImpl]来禁止内联,以避免在发布版本中发生意外。很难做到正确,最好避免这种情况。 - Hans Passant
2个回答

9

1

虽然这是一个老问题,但我认为这个信息需要补充:

你不能使用try/catch语句来捕获using语句,但你可以尝试/捕获程序集的解析

如果像Mike Atlas建议的那样手动加载程序集,你甚至可以拥有更多的控制权。

此外,你可以通过选择GetEntryAssembly.GetReferencedAssemblies()并与AssemblyName.GetAssemblyName()进行比较来在尝试解决之前手动验证程序集。

当然,在某些情况下,你可以使用简单的File.Exists(AssemblyPath),但上述方法将有助于验证其他程序集问题,如版本编号或签名。

AssemblyResolve通过提供基于事件的方法非常好。如果你的代码复杂度很高和/或想要跟随JIT,这将非常有用,但不如前期验证信息详细。

请注意“快速失败”原则,以及程序集解析错误可能会限制功能的程度。


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