C# 如何尝试捕获未找到的程序集

C# 如何尝试捕获未找到的程序集,c#,.net,C#,.net,好的,假设我有这样一个应用程序: using System; using AliensExist; // some DLL which can't be found... 我想要的是,如果找不到程序集DLL AlienExist,应用程序将不会返回错误,而是“trycatch”,类似于…: using System; try{ using AliensExist; // some DLL which can't be found... } catch {} 怎么做?我知道using关键字以后

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

using System;
using AliensExist; // some DLL which can't be found...
我想要的是,如果找不到程序集DLL AlienExist,应用程序将不会返回错误,而是“trycatch”,类似于…:

using System;
try{
using AliensExist; // some DLL which can't be found...
} catch {}
怎么做?我知道using关键字以后无法使用…但我现在太懒了,无法测试它


10倍

您不能在try/catch中真正做到这一点,但您可以在AppDomain上处理
AssemblyResolve
事件

有关更多详细信息,请参阅


但是,您至少需要编译代码。如果您试图“引用”可能存在或不存在的程序集,则需要动态加载该程序集并从该程序集开始工作。

旧问题,但我觉得需要添加以下信息:

您无法尝试/捕获using语句,但您可以

如果按照Mike Atlas的建议手动加载程序集,则可以进行更多的控制

此外,您还可以在尝试解析程序集之前,通过从中选择并与以下内容进行比较来手动验证程序集:

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

AssemblyResolve
提供了一种基于事件的方法。如果您有很高的圈复杂度和/或希望使用JIT,那么这很好,但信息量不如预先验证


请注意fail fast原则,以及程序集解决错误的程度可能会限制功能。

我认为代码必须首先编译,对吗?首先,使用
不指定dll。它指定可以在多个程序集(DLL)中定义的已用命名空间。using语句不会添加对另一个程序集的引用,您的项目生成选项会这样做。许多程序集包含与程序集名称相同的名称空间,这只是一个转移视线的事实。导致异常的是JIT编译器。当它尝试为来自缺少的程序集的类型生成代码时会发生这种情况。这要求它从程序集中读取元数据,然后再进行修改。您需要提前一次方法调用来捕获异常,至少对于Microsoft jitter来说是这样。对于Mono来说要快得多。您还需要使用[MethodImpl]抑制内联,以避免在发布版本中发生意外。很难做到正确,避免这种情况。