【问题标题】:Implementing DLL plugins实现 DLL 插件
【发布时间】:2020-11-15 21:00:25
【问题描述】:

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

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

我刚刚创建了 3 个项目 项目# 1 - 将在 SQL Server 上执行 CRUD 并生成名为 DLLClassLibrary.dll 的文件的 DLL

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

Project# 2 - 一个 DLL,它将在 MySQL 上执行 CRUD 并生成一个名为 DLLClassLibrary.dll 的文件

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

Project# 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 文件看到行为发生了变化。问题是实现这 2 个 DLL 的最佳方法是什么,无需相互删除,也无需在我的 Main 上对其进行硬编码。或者这是唯一的选择?

【问题讨论】:

  • 你到底在问什么?您没有明确的问题,对于本网站来说不是太宽泛。
  • 我想知道是否有实现 DLL 的简单方法。只是用相同的函数签名替换 DLL 的问题吗?或者有什么我需要注意的吗?
  • 所以您想在 win32 应用程序(可能是桌面/服务应用程序)和 .Net 核心网络应用程序之间共享您的数据访问项目 (dll)?并且您希望您的数据访问层能够处理 mysql 和 oracle 等不同的提供程序?
  • 考虑针对 ADO.NET IDb* 接口进行编程并使用工厂模式来创建特定于提供程序的对象。
  • 但是,您不应该使用仅在 MySQL 或 ORACLE 或 MSSQL 中工作的特定函数,例如 STRING_AGGGROUP_CONCATLISTAGG(分别为 MSSQL、MySQL、甲骨文)

标签: c# mysql sql-server ado.net


【解决方案1】:

我认为这个问题意味着您希望能够通过提供 DLL 并更改 *.config 文件而不重新编译来更改用于 DB 访问的 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 中,AppDomain 不是一个东西,您可以使用 AssemblyLoadContext(仅在 .NET Core 3.0 及更高版本中)。

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

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

【讨论】:

  • 那么我可以在主程序中有一个逻辑来读取配置以检查要使用的数据库访问类型,即如果 dbconfig == 'SQLSEVER' 加载此 DLL,否则加载另一个 DLL?其他应用程序如何实现像 PAINT.NET 这样的插件。您将 dll 放在一个文件夹中,应用程序只会在应用程序中添加功能。
  • 我找到了一个很好的插件实现。 codeproject.com/Articles/6334/Plug-ins-in-C 虽然,这不是我的想法,但我可以用它来解决这个问题。
猜你喜欢
  • 2011-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多