Вопрос

Я пытаюсь создать заставку, которая показывает состояние загрузки сборок (всех ссылочных библиотек).Я использую делегат AppDomain.AssemblyLoad AssemblyLoadEventHandler, чтобы определить, какая сборка загружается, но проблема в том, что событие не запускается при инициализации программы.Я попытался зарегистрировать обработчик событий при запуске приложения «MyApplication_Startup», но это не сработало.Вот мой тестовый код:

    Partial Friend Class MyApplication

    Private Sub MyApplication_Startup(ByVal sender As Object, ByVal e As Microsoft.VisualBasic.ApplicationServices.StartupEventArgs) Handles Me.Startup
        AddHandler AppDomain.CurrentDomain.AssemblyLoad, AddressOf MyAssemblyLoadEventHandler
    End Sub

    Sub MyAssemblyLoadEventHandler(ByVal sender As Object, ByVal args As AssemblyLoadEventArgs)
        Console.WriteLine(">>> ASSEMBLY LOADED: " + args.LoadedAssembly.FullName)
        Console.WriteLine()
    End Sub

End Class
Это было полезно?

Решение

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

Например, создайте новую сборку с классом «Hello World», ссылайтесь на нее с помощью любого исполняемого файла, затем удалите новую сборку из рабочего каталога, и вы никогда не заметите, что она загружена.

Затем при событии нажатия кнопки инициализируйте класс «Hello World», сохраните сборку удаленной из рабочего каталога, и вы получите сообщение об ошибке, что сборку невозможно найти при нажатии кнопки.

Это основная причина того, что первый доступ к базе данных в .Net обычно медленный и вызывает ощущение «ускорения» (чем больше вы его используете, тем быстрее он становится), то есть потому, что объекты, которые вы используете на своем уровне данных, не загружаются в среду выполнения, пока к ним не будет осуществлен доступ.

Другие советы

Хм, я не уверен насчет синтаксиса VB, но в C# я бы поместил его в Main(...) программы:

static void Main(string[] args)
{
    AppDomain.CurrentDomain.AssemblyLoad += new AssemblyLoadEventHandler(CurrentDomain_AssemblyLoad);
}

static void CurrentDomain_AssemblyLoad(object sender, AssemblyLoadEventArgs args)
{
    Console.WriteLine("Loaded " + args.LoadedAssembly.FullName);
}

ОБНОВЛЯТЬ: Используя Reflector, синтаксис VB выглядит следующим образом:

Private Shared Sub Main(ByVal args As String())
    AddHandler AppDomain.CurrentDomain.AssemblyLoad, New AssemblyLoadEventHandler(AddressOf Program.CurrentDomain_AssemblyLoad)
End Sub

Private Shared Sub CurrentDomain_AssemblyLoad(ByVal sender As Object, ByVal args As AssemblyLoadEventArgs)
    Console.WriteLine(("Loaded " & args.LoadedAssembly.FullName))
End Sub
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top