开发语言:C#
源码大小:39KB
源码大小:39KB
视频教程,进入B站可以看高清视频
1. 创建一个简单的DLL
首先,假设你有一个简单的C#类库项目,生成一个DLL文件。例如:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace test
{
public class Calculator
{
public int Add(int a, int b)
{
return a + b;
}
public int Subtract(int a, int b)
{
return a - b;
}
}
}编译这个项目后,你会得到一个test.dll文件。
2. 动态加载并调用DLL中的方法
接下来,你可以在另一个C#项目中动态加载这个DLL并调用其中的方法。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
// 加载DLL
Assembly assembly = Assembly.LoadFrom("test.dll");
// 获取类型
Type calculatorType = assembly.GetType("test.Calculator");
// 创建实例
object calculatorInstance = Activator.CreateInstance(calculatorType);
// 获取方法信息
MethodInfo addMethod = calculatorType.GetMethod("Add");
// 调用方法
object[] parameters = new object[] { 5, 3 };
int result = (int)addMethod.Invoke(calculatorInstance, parameters);
Console.WriteLine("5 + 3 = " + result);
// 调用另一个方法
MethodInfo subtractMethod = calculatorType.GetMethod("Subtract");
int subtractResult = (int)subtractMethod.Invoke(calculatorInstance, new object[] { 5, 3 });
Console.WriteLine("5 - 3 = " + subtractResult);
Console.ReadKey();
}
}
}3. 运行程序
确保test.dll文件位于与可执行文件相同的目录中,或者提供正确的路径。运行程序后,你会看到以下输出:
5 + 3 = 8 5 - 3 = 2
4. 注意事项
路径问题:确保DLL文件位于正确的路径,或者使用绝对路径来加载DLL。
异常处理:在实际应用中,建议添加异常处理来捕获可能出现的错误,例如文件未找到、类型未找到、方法未找到等。
性能:反射调用比直接调用方法要慢,因此在性能敏感的场景中应谨慎使用。
5. 使用dynamic关键字(可选)
如果你使用的是C# 4.0或更高版本,可以使用dynamic关键字来简化代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
// 加载DLL
Assembly assembly = Assembly.LoadFrom("test.dll");
// 获取类型
Type calculatorType = assembly.GetType("test.Calculator");
// 创建实例
dynamic calculatorInstance = Activator.CreateInstance(calculatorType);
// 调用方法
int result = calculatorInstance.Add(5, 3);
Console.WriteLine("5 + 3 = " + result);
// 调用另一个方法
int subtractResult = calculatorInstance.Subtract(5, 3);
Console.WriteLine("5 - 3 = " + subtractResult);
Console.ReadKey();
}
}
}使用dynamic关键字可以避免显式使用反射来调用方法,代码更加简洁。
总结
通过反射,你可以在运行时动态加载和调用C#编写的DLL中的方法。这种方法非常灵活,适用于插件系统、动态加载模块等场景。
本文来自 www.luofenming.com