C#高级:通过 Assembly 类加载 DLL 和直接引用DLL的方法大全
一、主项目不添加引用
(主项目不添加引用,而是通过路径获取指定dll)
1.打印类的属性名称
namespace ReflectionDemo
{
class Program
{
static void Main(string[] args)
{
// 指定【编译输出】的项目类库dll(启动项目编译输出目录下的dll)
string assemblyPath = @"F:\Personal\demo\bin\Debug\net5.0\BuildDatabaseTable.dll";
// 指定【类名.命名空间】
string className = "BuildDatabaseTable.DataSchoolDto";
PrintFieldNames(assemblyPath, className);
}
public static void PrintFieldNames(string assemblyPath, string className)
{
try
{
// 加载指定路径的程序集
Assembly assembly = Assembly.LoadFrom(assemblyPath);
// 打印所有类库下的所有类
var classList = assembly.ExportedTypes.ToList();
var classNameList = classList.Select(x => x.FullName).ToList();
Console.WriteLine(string.Join("\n", classList));
// 获取指定类的类型
Type type = assembly.GetType(className);
if (type != null)
{
// 获取类的所有属性
var fields = type.GetProperties();
// 打印每个属性的名称
Console.WriteLine($"{className}的属性有:");
foreach (var field in fields)
{
Console.WriteLine(field.Name);
}
}
else
{
Console.WriteLine($"未找到这个类:{className} ");
}
}
catch (Exception ex)
{
Console.WriteLine($"发生错误: {ex.Message}");
}
}
}
}
2.调用相应方法
namespace ReflectionDemo
{
class Program
{
static void Main(string[] args)
{
// 指定【编译输出】的项目类库dll(启动项目编译输出目录下的dll)
string assemblyPath = @"F:\Personal\demo\bin\Debug\net5.0\BuildDatabaseTable.dll";
// 指定【类名.命名空间】
string className = "BuildDatabaseTable.DataSchoolDto";
// 指定【方法名称】
string methodName = "ProcessInt";
// 调用方法
CallMethod(assemblyPath, className, methodName, 5);
}
public static void CallMethod(string assemblyPath, string className, string methodName, params object[] parameters)
{
try
{
// 加载指定路径的程序集
Assembly assembly = Assembly.LoadFrom(assemblyPath);
// 获取类的类型
Type type = assembly.GetType(className);
if (type == null)
{
Console.WriteLine($"无法找到类:{className}");
return;
}
// 判断类是否为静态类
bool isStatic = type.IsAbstract && type.IsSealed;
// 获取方法信息
MethodInfo method = type.GetMethod(methodName);
if (method == null)
{
Console.WriteLine($"未找到方法 {methodName}");
return;
}
// 如果是静态方法,直接调用
if (isStatic)
{
object result = method.Invoke(null, parameters);
Console.WriteLine($"静态方法调用结果:{result}");
}
else
{
// 非静态方法,先创建实例
object instance = Activator.CreateInstance(type);
object result = method.Invoke(instance, parameters);
Console.WriteLine($"非静态方法调用结果:{result}");
}
}
catch (Exception ex)
{
Console.WriteLine($"发生错误: {ex.Message}");
}
}
}
}
【注意】:如果是同一个解决方案下的类库相互加载、引用,不需要写完整路径,可直接写dll
跨解决方案:
string assemblyPath = @"F:\Personal\demo\bin\Debug\net5.0\BuildDatabaseTable.dll";
同一解决方案,可以写为:
string assemblyPath = @"BuildDatabaseTable.dll";
二、主项目添加引用
1.添加项目引用
2.使用引用
static void Main(string[] args)
{
try
{
//调用方法(dll名称.类名)
var res = BuildDatabaseTable.Program.ProcessInt(3);
Console.WriteLine(res);
//获取实例(dll名称.类名)
var entity = new BuildDatabaseTable.DistrictSandData();
entity.Id = 1;
}
catch (Exception ex)
{
Console.WriteLine($"发生错误: {ex.Message}");
}
}
原文地址:https://blog.csdn.net/m0_67412019/article/details/145201148
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!