实现 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
我打算延长我的申请。目前,我有 Data.dll 使用带有存储过程的 SQL 服务器的数据访问。我要做的是使其灵活,更改 DLL 会将数据访问更改为任何提供程序,如 MySQL 或 Oracle。目标是避免对主应用程序进行更改。我只是不确定在 C# 中实现它的最佳方法是什么。目前,我正在使用 win32,但想在我的另一个 ASP.NET Core API 上使用相同的概念。我计划对 Win32 使用 App.config 或对 WebApi 使用 Web.config 来更改配置。
-----更新使其更清晰 ----------
我刚刚创建了 3 个项目 项目# 1 - 将在 SQL 服务器上执行 CRUD 并生成名为 DLLClassLibrary.dll
的文件的 DLLpublic class Data
{
public string GetName()
{
return "NAME DLL SQL SERVER";
}
}
项目# 2 - 将在 MySQL 上执行 CRUD 并生成名为 DLLClassLibrary.dll
的文件的 DLLpublic 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