如何尝试捕捉未找到的assembly

好吧,说我有这样的应用程序:

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 {} 

怎么做? 我知道use关键字以后不能使用…但我现在太懒了测试它。

10倍!

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

有关更多详细信息,请参阅http://msdn.microsoft.com/en-us/library/system.appdomain.assemblyresolve.aspx 。

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

我认为你试图在运行时加载程序集,而不是编译时,正确吗?

如果是这样,请检查一下: C#在运行时加载程序集 。

老问题,但我觉得这个信息需要添加:

您不能尝试/捕获using语句,但您可以尝试/捕获程序集的解析 。

如果您按照Mike Atlas的建议手动加载程序集,您可以获得更多控制权。

此外,您可以在尝试解析之前手动validation程序集,方法是从GetEntryAssembly.GetReferencedAssemblies()中选择并比较AssemblyName.GetAssemblyName()之类的内容 。

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

通过提供基于事件的方法, AssemblyResolve很不错。 如果你有很高的圈复杂度和/或想要与JIT一起骑行,但是比前期validation更少信息,那就太好了。

请注意快速失败的主体,以及程序集解决错误可能限制function的程度。