gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 00:29:30 26 4
gpt4 key购买 nike

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

到现在为止还挺好。

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

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

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

最佳答案

只是为了让您知道术语,您正在寻找“Inversion of Control”或“IoC”。

有多种实现方式,包括 Dependency Injection和 Nico 的回答中的回调(例如委托(delegate))。还有服务定位器(尽管许多人认为这是一种“反模式”)和工厂。

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

基本上,您的 DLL(又名“class library”)需要一个可以执行功能的对象,但它需要其他人(调用者)来实现实际逻辑。

因此,您需要做的就是在您的 DLL 中创建一个接口(interface),该接口(interface)定义您需要的对象类型:

Namespace DLL

Public Interface IDataRetriever

Public Function GetData() As Object

End Interface

End Namespace

然后在引用您的 DLL 的 MainForm 项目中,只需创建一个实现此接口(interface)的类:
Public Class DataRetriever
Implements DLL.IDataRetriever

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

End Class

(请注意,任何类都可以实现接口(interface),包括已经存在的类,甚至 MainForm 本身。您不需要仅为接口(interface)创建新类 - 但请确保您遵循 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

关于.net - 如何从我的 DLL 访问 MainForm 中的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17096280/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com