实现 DLL 插件

Implementing DLL plugins

我打算延长我的申请。目前,我有 Data.dll 使用带有存储过程的 SQL 服务器的数据访问。我要做的是使其灵活,更改 DLL 会将数据访问更改为任何提供程序,如 MySQL 或 Oracle。目标是避免对主应用程序进行更改。我只是不确定在 C# 中实现它的最佳方法是什么。目前,我正在使用 win32,但想在我的另一个 ASP.NET Core API 上使用相同的概念。我计划对 Win32 使用 App.config 或对 WebApi 使用 Web.config 来更改配置。

-----更新使其更清晰 ----------

我刚刚创建了 3 个项目 项目# 1 - 将在 SQL 服务器上执行 CRUD 并生成名为 DLLClassLibrary.dll

的文件的 DLL
public class Data
{
    public string GetName()
    {
        return "NAME DLL SQL SERVER";
    }
}

项目# 2 - 将在 MySQL 上执行 CRUD 并生成名为 DLLClassLibrary.dll

的文件的 DLL
public class Data
{
    public string GetName()
    {
        return "NAME DLL MYSQL";
    }
}

项目# 3 - 我将在其中使用 DLL 的主应用程序。在程序中,我创建了对名为 DLLClassLibrary.dll.

的文件的引用
public partial class frmMain : Form
{
    DLLClassLibrary.Data data = new DLLClassLibrary.Data();
    public frmMain()
    {
        InitializeComponent();
    }

    private void frmMain_Load(object sender, EventArgs e)
    {
        txtOut.Text = data.GetName();
    }
}

使用项目#1 生成的 DLL 完成测试

使用项目#2 生成的 DLL 完成测试

如您所见,通过放置相同的 dll 文件,行为发生了变化。问题是实现这两个 DLL 的最佳方法是什么,而无需相互删除,也无需在我的 Main 上对其进行硬编码。或者这是唯一的选择?

我读这个问题的意思是您希望能够通过提供 DLL 并更改您的 *.config 文件而无需重新编译来更改用于数据库访问的 DLL。

为此,您必须将 DLL 的名称或路径放入配置文件中,然后从您的应用程序动态加载 DLL。

我不确定您是否经常更改数据库以使其值得,但让我们假设它是。

Windows 的旧 .NET 框架和 .NET Core 的实现方式不同。

在经典的.NET框架中,你会在运行时使用AppDomains动态加载DLL,然后使用反射或动态访问DLL中的类型和方法。

Loading DLLs at runtime in C#

    var DLL = Assembly.LoadFile(@"C:\visual studio 2012\Projects\ConsoleApplication1\ConsoleApplication1\DLL.dll");

    var class1Type = DLL.GetType("DLL.Class1");

    //Now you can use reflection or dynamic to call the method. I will show you the dynamic way

    dynamic c = Activator.CreateInstance(class1Type);
    c.Output(@"Hello");

在 .NET Core 中,AppDomains 不是一回事,您将使用 AssemblyLoadContext(仅在 .NET Core 3.0 及更高版本中)。

Microsoft Docs 上有一个很好的教程,介绍如何为您的应用程序实现插件:

https://docs.microsoft.com/dotnet/core/tutorials/creating-app-with-plugin-support