如何从我的DLL访问我的MainForm中的函数

时间:2013-06-13 20:20:19

标签: .net vb.net dll

我有一个MainForm类,我有一个函数来检索存储在我的数据库中的设置。

到目前为止一切顺利。

然后,我在启动时加载了一个插件(DLL),但我想使用相同的函数来检索我的DLL中的设置。

如果我需要访问我的DLL中的函数,我只需输入myDLL.function(....),但我不能使用我的DLL中的MainForm.function,因为我的DLL不知道MainForm。

那么如何在主应用程序和我的dll之间传递设置?

2 个答案:

答案 0 :(得分:4)

只是你知道这个术语,你正在寻找“Inversion of Control”或“IoC”。

有多种方法可以实现这一点,包括Dependency Injection和回调(例如委托),如Nico的答案。服务定位器(虽然许多人认为这是一个“反模式”)和工厂。

就个人而言,我更喜欢依赖注入方法:

基本上,你的DLL(a.k.a。“class library”)需要一个可以执行函数的对象,但是需要其他人(调用者)来实现实际的逻辑。

因此,您需要做的就是在DLL中创建一个界面,用于定义所需的对象类型:

Namespace DLL

    Public Interface IDataRetriever

        Public Function GetData() As Object

    End Interface

End Namespace

然后在引用您的DLL的MainForm项目中,只需创建一个实现此接口的类:

Public Class DataRetriever
    Implements DLL.IDataRetriever

    Public Function GetData() As Object Implements DLL.IDataRetriever.GetData
        //...
        Return New Object()
    End Function

End Class

(注意任何类可以实现接口,包括已经存在的类,甚至是MainForm本身。你不需要为接口创建一个新类 - 尽管确保您正在关注separation of concerns。)

现在,当你调用DLL时,你可以将它传递给你的DataRetriever,你的DLL就会知道它正在处理什么。

Namespace DLL

    Public Class Utility

        Public Shared Function DLLFunction( retriever as IDataRetriever )
            retriever.GetData()
        End Function

    End Class

End Namespace

Class MainForm

    Sub Example()

        DLL.Utility.DLLFunction( New DataRetriever() )

    End Sub

End Class

答案 1 :(得分:2)

这取决于你有什么样的设置。

最干净的方法可能是检索主应用程序中的设置并将其(作为参数)传递给DLL。您可能希望为实际设置数据指定接口或其他内容。这种常见类型可能位于DLL和主应用程序项目引用的项目中。

另一种方法是传递委托。您可以将委托传递给可以检索数据的方法,而不是传递完整的设置数据。