Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实现DLL插件_C#_Mysql_Sql Server_Ado.net - Fatal编程技术网

C# 实现DLL插件

C# 实现DLL插件,c#,mysql,sql-server,ado.net,C#,Mysql,Sql Server,Ado.net,我打算扩展我的申请。目前,我有Data.dll,它使用SQL Server和存储过程进行数据访问。我要做的是使它变得灵活,因为更改DLL将更改对任何提供程序(如MySQL或Oracle)的数据访问。目标是避免对主应用程序进行更改。我只是不确定在C#中实现这一点的最佳方式是什么。目前,我正在使用win32,但希望在其他ASP.NET核心API上使用相同的概念。我计划使用App.config for Win32或WebApi的Web.config来更改配置 -----更新以使其更清晰--------

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

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

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

public class Data
{
    public string GetName()
    {
        return "NAME DLL SQL SERVER";
    }
}
public class Data
{
    public string GetName()
    {
        return "NAME DLL MYSQL";
    }
}
Project#2-一个DLL,它将在MySQL上执行CRUD并生成一个名为DLLClassLibrary.DLL的文件

public class Data
{
    public string GetName()
    {
        return "NAME DLL SQL SERVER";
    }
}
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();
    }
}
使用Project#1生成的DLL完成测试

使用Project#2生成的DLL完成测试


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

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

为此,您必须在配置文件中输入DLL的名称或路径,并从应用程序中动态加载DLL

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

在旧的.NET framework for Windows和.NET Core之间,实现这一点的方法是不同的

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

在.NET Core中,AppDomains不是一个东西,您应该使用AssemblyLoadContext(仅在.NET Core 3.0及更高版本中)

关于如何实现应用程序插件的Microsoft文档,有一个很好的教程:


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

为此,您必须在配置文件中输入DLL的名称或路径,并从应用程序中动态加载DLL

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

在旧的.NET framework for Windows和.NET Core之间,实现这一点的方法是不同的

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

在.NET Core中,AppDomains不是一个东西,您应该使用AssemblyLoadContext(仅在.NET Core 3.0及更高版本中)

关于如何实现应用程序插件的Microsoft文档,有一个很好的教程:


你到底在问什么?你没有一个定义的问题对这个网站来说不是太广泛。我想知道是否有一个实现DLL的简单方法。这只是用相同的函数签名替换DLL的问题吗?或者有什么我需要知道的吗?所以你想在win32应用程序(可能是桌面/服务应用程序)和.Net核心web应用程序之间共享你的数据访问项目(dll)?您需要一个数据访问层来处理不同的提供者,比如MySQL和Oracle?考虑对ADO.NET IDB*接口进行编程,并使用工厂模式来创建特定于提供者的对象。但是,您不应该使用只在MySQL或Oracle或MSSQL中工作的特定函数,例如“代码> STRIGIGAGG< <代码>,
GROUP\u CONCAT
LISTAGG
(分别针对MSSQL、MySQL和Oracle)您在这里到底想问什么?你没有一个定义的问题对这个网站来说不是太广泛。我想知道是否有一个实现DLL的简单方法。这只是用相同的函数签名替换DLL的问题吗?或者有什么我需要知道的吗?所以你想在win32应用程序(可能是桌面/服务应用程序)和.Net核心web应用程序之间共享你的数据访问项目(dll)?您需要一个数据访问层来处理不同的提供者,比如MySQL和Oracle?考虑对ADO.NET IDB*接口进行编程,并使用工厂模式来创建特定于提供者的对象。但是,您不应该使用只在MySQL或Oracle或MSSQL中工作的特定函数,例如“代码> STRIGIGAGG< <代码>,
GROUP_CONCAT
LISTAGG
(分别适用于MSSQL、MySQL和Oracle),因此我可以在主程序中使用逻辑来读取配置,以检查要使用的数据库访问类型,即如果dbconfig='SQLSEVER'加载此DLL,则加载另一个DLL?其他应用程序如何实现PAINT.NET之类的插件。你将dll放在一个文件夹中,应用程序将只在应用程序中添加功能。我发现了一个很好的插件实现。虽然,这不是我想要的,但我可以用它来回答这个问题。那么,我可以在主程序中使用一个逻辑来读取配置,以检查要使用的数据库访问类型,即如果dbconfig='SQLSEVER'加载此DLL,否则加载另一个DLL?其他应用程序如何实现PAINT.NET之类的插件。你将dll放在一个文件夹中,应用程序将只在应用程序中添加功能。我发现了一个很好的插件实现。虽然,这不是我想要的,但我可以用它来回答这个问题。