.net 如何从DLL访问MainForm中的函数

.net 如何从DLL访问MainForm中的函数,.net,vb.net,dll,.net,Vb.net,Dll,我有一个MainForm类,其中有一个函数可以检索存储在数据库中的设置 到目前为止还不错 然后,我在启动时加载了一个插件(DLL),但我想使用相同的函数来检索DLL中的设置 如果我需要访问DLL中的函数,我只需键入myDLL.function(..),但我不能从DLL中使用MainForm.function,因为我的DLL不知道MainForm 那么,如何在主应用程序和dll之间传递设置呢?为了让您了解术语,您正在寻找“”或“IoC” 实现这一点的方法有多种,包括Nico回答中提到的回调(如委托

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

到目前为止还不错

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

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


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

为了让您了解术语,您正在寻找“”或“IoC”

实现这一点的方法有多种,包括Nico回答中提到的回调(如委托)。也有服务定位器(虽然许多人认为这是一种“反模式”)和工厂。 就个人而言,我更喜欢依赖注入方法:

基本上,您的DLL(又称“DLL”)需要一个可以执行函数的对象,但它需要其他人(调用方)来实现实际的逻辑

因此,您只需在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本身。您不需要仅为接口创建新类,但请确保遵循。)

现在,当你调用DLL时,你可以把它传递给你的数据检索器,你的DLL就会知道它在处理什么

Namespace DLL

    Public Class Utility

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

    End Class

End Namespace


这取决于您的设置类型

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


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

如果只需要传递参数,传递参数肯定比依赖注入更容易。为了获得更高级的功能,我会选择依赖注入而不是委托(更容易测试,代码更干净,等等)。但每个人都有自己的。
Class MainForm

    Sub Example()

        DLL.Utility.DLLFunction( New DataRetriever() )

    End Sub

End Class