экран-заставка со статусом загрузки сборки
-
03-07-2019 - |
Вопрос
Я пытаюсь создать заставку, которая показывает состояние загрузки сборок (всех ссылочных библиотек).Я использую делегат 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