我想一个插件系统放在一起使用.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现在)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top