28

Is it possible to catch the exception when a referenced .dll cannot be found?

For example, I have a C# project with a reference to a third-party dll; if that dll cannot be found, an exception is thrown. The exception is a System.IO.FileNotFoundException, but I am unable to determine where to catch it. The following code did not seem to work:

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());
        }
    }
}
Richard Morgan
  • 7,601
  • 9
  • 49
  • 86

3 Answers3

42

Extending Josh's answer.

Assemblies in .Net are loaded on demand by the CLR. Typically an assembly load won't be attempted until a method is JIT'd which uses a type from that assembly.

If you can't catch the assembly load failure with a try/catch block in the main method, it's likely beceause you're using a type from the assembly within the try/catch. So the exception occurs before the main method is actually run.

Try putting all of the code from the main method in a different function. Then call that function within the try/catch block and you should see the exception.

JaredPar
  • 733,204
  • 149
  • 1,241
  • 1,454
34

You can use AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);

  Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
    {
    }

To manually find the assembly if it can't find it automaticaly.

JoshBerke
  • 66,142
  • 25
  • 126
  • 164
0

For a Form Application put the try/catch in Program.cs. (Expanding on JaredPat's answer).

Like this:

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

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

This will catch any missing DLL exceptions from your application. And they'll look similar to this:

Could not load file or assembly 'TheGreatestDLLEver.Tribute, Version=0.0.0.2, Culture=neutral, PublicKeyToken=jamtoastbutter' or one of its dependencies. The system cannot find the file specified.

TinyRacoon
  • 4,655
  • 2
  • 23
  • 22