Createinstance () - هل أفعل هذا صحيح؟
-
09-09-2019 - |
سؤال
أحاول وضع نظام إضافي مع .NET، وأنا لست متأكدا مما إذا كنت أفعل ذلك بشكل صحيح. أساس النظام هو أن دليل معين ({{{{{{{{{{} {{{{{}} (يتم تعريف هذا في DLL آخر، لكنني سأذهب إلى ذلك لاحقا)، ثم قم بإنشاء مثيل لها واستدعاء وظيفة محددة في الحالة المذكورة.
Public Sub ScanPluginsInDirectory(ByVal Directory As String)
Dim Plugins As New IO.DirectoryInfo(Directory)
Dim Files As IO.FileInfo() = Plugins.GetFiles("*.dll")
Dim CryptType As Type = GetType(CryptPluginBase)
Dim PluginsData as List(Of LoadedPluginsInfo)
For Each DllFile As IO.FileInfo In Files
Try
Dim thisAsm As Assembly = Assembly.LoadFrom(DllFile.FullName)
Dim ClassDefs = thisAsm.GetTypes().Where(Function(type) CryptType.IsAssignableFrom(type))
For Each ClassDef As Type In ClassDefs
Dim A As Object
A = ClassDef.Assembly.CreateInstance(ClassDef.Name)
PluginsData.Add(New LoadedPluginsInfo(A.Plugin(), False))
Next
Catch ex As Exception
Continue For
End Try
Next
End Sub
المشكلة المحددة لدي هي، لست متأكدا من أن هذه هي الطريقة الصحيحة للقيام بذلك. سوف الطريقة التي أحاول القيام بها، إذا كان يمكن افتراض ذلك A.Plugin()
في الواقع موجود وأي هياكل ودروس المشار إليها هنا خالية من الأخطاء؟ إذا احتاج أي شخص إلى مزيد من التعليمات البرمجية للمساعدة، يمكنني نشره.
المحلول
وعموما يجب أن تعمل الاستراتيجية. سيتم تحميل المكالمات الجمعية. تحميل الجمعية المستهدفة في العملية. من هناك، من الممكن إجراء فحص الكتابة وإنشاء مثيلات لهذه الأنواع.
أعتقد أن الطريقة الأسهل والأكثر موثوقية لإنشاء المثيل هي استخدام طريقة Activator.CreateInstance.
For Each def As Type in ClassDefs
Dim inst = Activator.CreateInstance(def)
PluginsData.Add(new LoadedPluginsInfo(inst.Plugin(), False))
Next
اعتمادا على أهدافك، سيكون اقتراح آخر هو نقل كتلة TRY / CATCK إلى الحلقة بدلا من ذلك. إن وجود كتلة TRY / CATCK على الجزء الخارجي من الحلقة يعني أنه إذا كان لدى أي نوع معين في التجميع خطأ، فستجاهل جميع الأنواع من تلك الجمعية. سيسمح لك تحريكها بداخلها بتجاهل الأنواع التي لا تعمل فقط كما تتوقع. هل قد يكون السلوك الحالي نيتك.
نصائح أخرى
هذا يجب أن يعمل، لقد كنت أستخدم هذا النوع من الأشياء في بعض المشاريع من قبل. لقد بحثت على وجه التحديد عن منشئ وتسابقها ولكن بصرف النظر عن ذلك كانت نفس الفكرة.
ولكن قد ترغب في النظر في مهد, ، الذي يعتني بالكثير من الأشياء بالنسبة لك للحصول على بنية مسافة البرنامج المساعد (إذا كنت على استعداد للانتظار قليلا لإصدار الإصدار، فهذا لا يزال CTP الآن).