好的,我说有这样的应用程序:
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倍!
答案 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一起骑行,但是比前期验证更少信息,那就太好了。
请注意快速失败的主体,以及程序集解决错误的程度可能会限制功能。