2010-08-06 3 views
1

для приложения Мне нужно проверить наличие библиотек времени выполнения Crystal Reports. То, что я попытался это:Когда .Net загружает сборку и как ее изменить?

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 о пропавшем Кристал зависимости брошено в методе, который вызывает CheckCrystal перед вызовом метода. Похоже, что .Net знает, что ему понадобится сборка, прежде чем понадобится. Это правда? Как я могу изменить это поведение?

Заранее благодарен.

ответ

5

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

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

3

Возможно, вы захотите обработать событие AppDomain.AssemblyResolve. Дополнительная информация here.

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

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 
} 
3

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

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

Любая ручная загрузка или ручка AppDomain.AssemblyResolve.

 Смежные вопросы

  • Нет связанных вопросов^_^