سؤال

أحاول إنشاء شاشة بداية تعرض حالة تحميل التجميعات (جميع المكتبات المشار إليها).أستخدم مندوب 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
هل كانت مفيدة؟

المحلول

وقضية واحدة وأنت تسير لتصل الى أن التجميعات في صافي لن يتم تحميل حتى تكون هناك حاجة إليها.

وعلى سبيل المثال، إنشاء جمعية جديدة مع فئة "مرحبا أيها العالم" في ذلك، مرجع له مع أي قابل للتنفيذ، ثم حذف البرلمان الجديد من دليل العمل، في أي وقت من الأوقات ستلاحظ أن يتم تحميله.

وبعد ذلك، على حدث نقرة زر، تهيئة الطبقة "مرحبا أيها العالم"، والحفاظ على التجمع حذفها من دليل العمل، وسوف تتلقى الخطأ أن التجمع لا يمكن العثور عليه عندما يتم النقر على زر.

وهذا هو السبب الرئيسي الذي الوصول إلى قاعدة البيانات الأولى بطيئة عموما في صافي، ويحتوي على "تسريع" لأنه يشعر (مزيد من استخدامه، وأسرع تحصل عليه)، وهذا هو لأن الكائنات التي تستخدم في الخاص لا يتم تحميل طبقة البيانات في وقت التشغيل حتى يتم الوصول إليها.

نصائح أخرى

حسنًا، لست متأكدًا من بناء جملة VB، ولكن في C#، أود أن أضعه في البرنامج الرئيسي (...):

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);
}

تحديث: باستخدام العاكس، يبدو أن بناء جملة 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