C# 动态加载 DLL 文件并实现调用其中的方法是一个在编写 C# 程序时常见的需求,下面将介绍如何实现此功能。
1. 加载 dll 文件
调用 DLL 文件中的方法,需要先将 DLL 加载到当前进程中。有两种方式可以加载 DLL 文件:
1.1. 使用 Assembly 类加载 DLL
using System.Reflection;
// 加载 mydll.dll 文件
Assembly assembly = Assembly.LoadFrom("mydll.dll");
1.2. 使用 Win32 API 加载 DLL
using System.Runtime.InteropServices;
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern IntPtr LoadLibrary(string dllToLoad);
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
static extern bool FreeLibrary(IntPtr hModule);
// 加载 mydll.dll 文件
IntPtr dllHandle = LoadLibrary("mydll.dll");
// 卸载 mydll.dll 文件
FreeLibrary(dllHandle);
2. 访问 DLL 中的类和方法
在将 DLL 文件加载到当前进程后,就可以使用反射获取 DLL 中的类和方法了。
2.1. 使用反射获取类和方法
using System.Reflection;
// 加载 mydll.dll 文件
Assembly assembly = Assembly.LoadFrom("mydll.dll");
// 获取 MyClass 类
Type myClassType = assembly.GetType("MyClass");
// 创建 MyClass 类的实例
object myClassInstance = Activator.CreateInstance(myClassType);
// 获取 MyClass 类的 SayHello 方法
MethodInfo sayHelloMethod = myClassType.GetMethod("SayHello");
// 调用 MyClass 类的 SayHello 方法
sayHelloMethod.Invoke(myClassInstance, null);
这里假设 DLL 中的 C# 类名为 MyClass
,其中有一个名为 SayHello
的公共方法,使用上述代码可以在当前进程中动态加载 DLL 文件并调用其中的方法。
2.2. 示例说明:使用 DLL 文件实现四则运算
在 DLL 文件中定义一个 Arithmetic
类,包含加、减、乘、除四种基本运算方法,使用上述反射方法可以动态调用这些方法。以下是 Arithmetic
类的定义:
public class Arithmetic
{
public static double Add(double a, double b)
{
return a + b;
}
public static double Sub(double a, double b)
{
return a - b;
}
public static double Mul(double a, double b)
{
return a * b;
}
public static double Div(double a, double b)
{
if (b == 0)
{
throw new DivideByZeroException();
}
return a / b;
}
}
接下来,我们可以使用以下代码,加载上述 DLL 文件并调用其中的方法:
using System.Reflection;
// 加载 Arithmetic.dll 文件
Assembly assembly = Assembly.LoadFrom("Arithmetic.dll");
// 获取 Arithmetic 类
Type arithmeticType = assembly.GetType("Arithmetic");
// 调用 Arithmetic 类的 Add 方法
double result1 = (double)arithmeticType.InvokeMember("Add", BindingFlags.InvokeMethod | BindingFlags.Static | BindingFlags.Public, null, null, new object[] { 2.0, 3.0 });
// 调用 Arithmetic 类的 Sub 方法
double result2 = (double)arithmeticType.InvokeMember("Sub", BindingFlags.InvokeMethod | BindingFlags.Static | BindingFlags.Public, null, null, new object[] { 3.0, 2.0 });
// 调用 Arithmetic 类的 Mul 方法
double result3 = (double)arithmeticType.InvokeMember("Mul", BindingFlags.InvokeMethod | BindingFlags.Static | BindingFlags.Public, null, null, new object[] { 2.0, 3.0 });
// 调用 Arithmetic 类的 Div 方法
double result4 = (double)arithmeticType.InvokeMember("Div", BindingFlags.InvokeMethod | BindingFlags.Static | BindingFlags.Public, null, null, new object[] { 6.0, 2.0 });
上述代码加载 DLL 文件 Arithmetic.dll
,并分别调用 DLL 文件中的 Add
、Sub
、Mul
和 Div
四个方法。
3. 总结
在 C# 程序中,动态加载 DLL 文件并实现调用其中方法是实现插件化的常见方式之一。本文介绍了两种方式加载 DLL 文件,并使用反射获取其中的类和方法。同时,通过示例说明,说明了如何使用 DLL 文件实现四则运算。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c# 动态加载dll文件,并实现调用其中的方法(推荐) - Python技术站