.net 如何从DLL访问MainForm中的函数
我有一个MainForm类,其中有一个函数可以检索存储在数据库中的设置 到目前为止还不错 然后,我在启动时加载了一个插件(DLL),但我想使用相同的函数来检索DLL中的设置 如果我需要访问DLL中的函数,我只需键入.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回答中提到的回调(如委托
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