【问题标题】:Consuming a DLL in EXE在 EXE 中使用 DLL
【发布时间】:2011-11-20 17:03:08
【问题描述】:

上周我和朋友讨论了使用 DLL(.net DLL) 中的类。我有一个 .net DLL,我需要在我的 Exe 中使用它。

正常情况

  1. 我在我的解决方案中添加 DLL 并在我的 Exe 中引用该 DLL
  2. 创建类的对象(在我的 DLL 中)
  3. 从刚刚创建的对象开始调用类中的方法/function。

但最终决定,我们应该使用反射而不是我们正在做的方式。原因是松耦合。可以更改 DLL 中的功能并对其进行编译。在这种情况下,您不需要编译客户端代码。

我有一个关于这个背景的问题。

假设,我有一个非常简单的应用程序(比如控制台应用程序),并且我有两个类都被编写来完成不同的工作。

class Program
{
    static void Main()
    {

        //How do you create a object of the class A. 

    }
}


class A
{

    string A = "I am from A";
    public B b; 
    public A
    {
        b = new B();

    }
}

class B
{

    string B = "I am from B";
    public B
    {

    }
    public void Print()
    {
        Console.WriteLine(B);
    }
}      

当三个类都是同一个exe时如何创建A类的对象,当A类和B类在不同的DLL中时如何创建相同的对象。

问题第二部分的一个答案是使用接口和使用反射。

反射是真的需要,还是一种编程标准。

创建类对象的最佳实践是什么。

【问题讨论】:

  • 接口是实现松耦合的正确方法。我不确定使用反射来实现松散耦合,但任何好的模式/方法都不会涉及使用反射。
  • 一般来说,您不需要在 C# 中重新编译/部署 .exe 使用反射,除非您更改实际在 . exe,在这种情况下,无论如何您都必须重新编译。使用没有反射的接口,你应该没问题。
  • 是的,请不要尝试使用反射来复制类库的功能...

标签: c# dll consuming


【解决方案1】:

接口提供了一种松耦合的方式。

如果您想在不重新编译甚至重新部署的情况下提供扩展或替换功能的能力,那么您基本上是在寻找基于松散耦合接口之上的插件类型架构。

您可以使用反射来迭代并创建对象的实例,但另一个选项是配置/注册。例如,在您的配置文件(或注册表等)中,您可以指向实现该接口的文件和类,并使用 System.Activator 在运行时创建它。

例子:

http://msdn.microsoft.com/en-us/library/ms972962.aspx

另一个更强大的选项是 MEF。它是由 .net 框架团队开发的插件框架。

查看此链接:

http://mef.codeplex.com/

来自该链接(加强您的问题):

“应用程序需求经常变化,软件也在不断发展。因此,此类应用程序通常会变得单一,因此难以添加新功能。托管可扩展性框架 (MEF) 是 .NET Framework 4 和 Silverlight 4 中的一个新库它通过简化可扩展应用程序和组件的设计来解决这个问题。”

希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 2020-12-16
    • 2019-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多