Подтвердить что ты не робот

Могу ли я поймать недостающую ошибку dll при загрузке приложения в С#?

Можно ли поймать исключение, если ссылочная .dll не найдена?

Например, у меня есть проект С# со ссылкой на стороннюю 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());
        }
    }
}
4b9b3361

Ответ 1

Расширение ответа Josh.

Ассембли в .Net загружаются по требованию CLR. Обычно загрузка сборок не будет предпринята до тех пор, пока не будет выбран метод JIT'd, который использует тип из этой сборки.

Если вы не можете поймать сбой сборки сбоку с помощью блока try/catch в основном методе, вероятно, из-за того, что вы используете тип из сборки в try/catch. Таким образом, исключение возникает до того, как основной метод будет запущен.

Попробуйте поместить весь код из основного метода в другую функцию. Затем вызовите эту функцию внутри блока try/catch, и вы увидите исключение.

Ответ 2

Вы можете использовать AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);

  Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
    {
    }

Чтобы вручную найти сборку, если она не может найти ее автоматически.

Ответ 3

Для приложения формы поместите 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 = jamtoastbutter 'или одна из его зависимостей. Система не может найти указанный файл.