【问题标题】:How to access a function in my MainForm from my DLL如何从我的 DLL 访问 MainForm 中的函数
【发布时间】:2013-06-13 20:20:19
【问题描述】:

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

到目前为止一切顺利。

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

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

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

【问题讨论】:

    标签: .net vb.net dll


    【解决方案1】:

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

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

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

    基本上,您的 DLL(又名“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
    

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 如果只需要这样的话,传递参数肯定比依赖注入更容易。对于更高级的功能,我更喜欢依赖注入而不是委托(更容易测试,更简洁的代码等)。不过,各有各的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多