的CreateInstance() - 我这样做对吗?
-
09-09-2019 - |
题
我想一个插件系统放在一起使用.NET,我不知道如果我做正确。该系统的基础是一个特定的目录({APPPATH} /插件/)将有一大堆的预编译的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块意味着,如果在装配任何给定类型确实有错误,你将放弃所有类型的从组件。移动它里面可以让你放弃只expect.d当前的行为可能是你的意图,虽然不工作的类型。
其他提示
这应该工作,我一直在使用之前,这种事情在一些项目。我特别寻找一个构造函数和调用它,但除了它是同样的想法。
但你可能想看看 MEF ,该负责的事情很多,为您的插件架构(如果你愿意等待一个位的发行版,它仍然是CTP现在)。
不隶属于 StackOverflow