在C#的应用程序加载期间,我可以捕获丢失的DLL错误吗?

时间:2009-07-10 18:40:04

标签: c# .net dll

是否有可能在找不到引用的.dll时捕获异常?

例如,我有一个C#项目,引用了第三方dll;如果找不到该dll,则抛出异常。例外是System.IO.FileNotFoundException,但我无法确定将其捕获的位置。以下代码似乎不起作用:

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        try
        {
          // code goes here
        }
        catch (Exception exc)
        {
            MessageBox.Show(exc.ToString());
        }
    }
}

3 个答案:

答案 0 :(得分:36)

延长乔希的答案。

.Net中的程序集由CLR按需加载。通常,在使用JIT的方法之前不会尝试组装加载,该方法使用该组件中的类型。

如果您无法在main方法中使用try / catch块捕获程序集加载失败,则可能是因为您在try / catch中使用了程序集中的类型。因此异常发生在main方法实际运行之前。

尝试将main方法中的所有代码放在不同的函数中。然后在try / catch块中调用该函数,您应该看到异常。

答案 1 :(得分:33)

您可以使用AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);

  Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
    {
    }

如果无法自动找到程序集,请手动查找程序集。

答案 2 :(得分:0)

对于表单应用程序,将try / catch放入Program.cs。 (扩展JaredPat的答案)。

赞:

    [STAThread]
    static void Main()
    {
        try
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());

        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
            throw;
        }
    }

这将从应用程序中捕获所有丢失的DLL异常。它们看起来类似于:

  

无法加载文件或程序集'TheGreatestDLLEver.Tribute,   版本= 0.0.0.2,文化=中性,PublicKeyToken =垃圾邮件”或   它的依赖项之一。系统找不到指定的文件。