Когда .Net загружает сборку и как изменить это поведение? - PullRequest
1 голос
/ 06 августа 2010

для приложения мне нужно проверить наличие библиотек времени выполнения Crystal Reports. Я попробовал:

    void CheckCrystal()
    {
        try
        {
            CrystalDecisions.Windows.Forms.CrystalReportViewer test = new CrystalDecisions.Windows.Forms.CrystalReportViewer();
            test.Dispose();
        }
        catch (System.Exception)
        {
            PTrace.Error("Some dependences needed to run Crystal Reports are not available.");
            throw;
        }
    }

Это не работает, потому что File.IOException об отсутствующей зависимости Crystal выдается в методе, который вызывает CheckCrystal перед вызовом метода. Это как .Net знает, что ему понадобится сборка, прежде чем она понадобится. Это правда? Как я могу изменить это поведение?

Заранее спасибо.

Ответы [ 3 ]

5 голосов
/ 06 августа 2010

Это потому, что код JITted для каждого метода, поэтому, когда вы впервые пытаетесь вызвать CheckCrystal(), .NET сначала пытается скомпилировать его, затем загружая все необходимые и еще не загруженные сборки.

.NET позволяет перехватить момент, когда сбой разрешения сборки. Для этого подпишитесь на AppDomain.AssemblyResolve событие.

3 голосов
/ 06 августа 2010

Похоже, что .Net знает, что ему понадобится сборка, прежде чем она понадобится. Это правда?

Для повышения производительности при запуске CLR лениво загружает сборки.

Либо вручную загрузить, либо обработать AppDomain.AssemblyResolve событие.

3 голосов
/ 06 августа 2010

Возможно, вы захотите обработать событие AppDomain.AssemblyResolve. Больше информации здесь .

Быстрый и грязный пример:

 AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;

 private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
 {
     if (args.Name == "CrystalReports")
     {
         PTrace.Error("Some dependences needed to run Crystal Reports are not available.");
     }

     // return located here assembly here or throw exception, etc
 }
...