我正在尝试将插件系统与.NET 组合在一起,但我不确定我是否做得正确。系统的基础是特定的目录({apppath}/Plugins/)将有一堆预编译的DLL,我想用反射来查看每个DLL,以及每个可用的类,如果它继承了特定的基类(这是在另一个 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()
实际上存在并且此处引用的任何结构和类都没有错误吗?如果有人需要更多代码来提供帮助,我可以发布它。
总体而言,该策略应该有效。 Assembly.LoadFrom 调用会将目标程序集加载到进程中。从那里可以进行类型检查并创建这些类型的实例。
我认为创建实例最简单、最可靠的方法是使用 Activator.CreateInstance 方法。
For Each def As Type in ClassDefs
Dim inst = Activator.CreateInstance(def)
PluginsData.Add(new LoadedPluginsInfo(inst.Plugin(), False))
Next
根据您的目标,另一个建议是将 Try/Catch 块移入循环而不是移出循环。将 Try/Catch 块放在循环外部意味着如果程序集中的任何给定类型确实有错误,您将丢弃该程序集中的所有类型。将其移入内部将允许您仅丢弃不能按预期工作的类型。d 不过,当前的行为可能是您的意图。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)