如何尝试捕捉未找到的装配

时间:2011-03-04 19:32:24

标签: c# .net

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

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倍!

3 个答案:

答案 0 :(得分:8)

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

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

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

答案 1 :(得分:3)

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

如果有,请查看:C# Load assemblies at runtime

答案 2 :(得分:0)

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

您无法尝试/捕获使用声明,但您可以try/catch the resolving of an assembly

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

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

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

通过提供基于事件的方法,

AssemblyResolve很不错。如果你有很高的圈复杂度和/或想与JIT一起骑行,但是比前期验证更少信息,那就太好了。

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