C#高级:通过 Assembly 类加载 DLL 和直接引用DLL的方法大全

ops/2025/1/20 1:44:50/

一、主项目不添加引用

(主项目不添加引用,而是通过路径获取指定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}");}
}


http://www.ppmy.cn/ops/151530.html

相关文章

网络安全 | 什么是正向代理和反向代理?

关注:CodingTechWork 引言 在现代网络架构中,代理服务器扮演着重要的角色。它们在客户端和服务器之间充当中介,帮助管理、保护和优化数据流。根据代理的工作方向和用途,代理服务器可分为正向代理和反向代理。本文将深入探讨这两种…

【C++篇】红黑树的实现

目录 前言: 一,红黑树的概念 1.1,红黑树的规则 1.2,红黑树的最长路径 1.3,红黑树的效率分析 二,红黑树的实现 2.1,红黑树的结构 2.2,红黑树的插入 2.2.1,大致过程…

Hooks 使用规则

Hooks 使用规则 命名规则 Hook 必须 useXxx 格式来命名。 PS:这种命名规则也很易读,简单粗暴 调用位置 Hook 或自定义 Hook ,只能在两个地方被调用 组件内部其他 Hook 内部 组件外部,或一个普通函数中,不能调用…

Python 爬虫爬取京东商品信息 ||京东商品详情API

Python 爬虫爬取京东商品信息 下面我将逐一解释每一部分的代码 导入库 from selenium import webdriver from selenium.webdriver.edge.service import Service from selenium.webdriver.edge.options import Options import time import random import csv from selenium.…

Vim 项目的现状

以下是 Vim 项目的现状: 维护与开发团队 团队变动:创始人 Bram Moolenaar 于 2023 年 8 月去世后,主要维护者 Christian Brabandt 承担起更多责任,并接纳了更多的开发者加入,如 Yegappan Lakshmanan、Dominique Pell …

攻防世界 unseping

开启场景 整体来说是创建了一个case类,然后可接受post传来的ctf的值,并对其进行base64解码以及反序列化。所以我们能控制ctf变量。 先看__wakeup方法,该方法使用waf方法对$arg中的内容进行了防护,过滤掉了| & ; 空格 / cat f…

Kotlin 极简小抄 P7- 空安全(安全调用操作符、Elvis 操作符、非空断言操作符、let 函数)

Kotlin 概述 Kotlin 由 JetBrains 开发,是一种在 JVM(Java 虚拟机)上运行的静态类型编程语言 Kotlin 旨在提高开发者的编码效率和安全性,同时保持与 Java 的高度互操作性 Kotlin 是 Android 应用开发的首选语言,也可…

设计模式-结构型-装饰器模式

装饰器模式(Decorator Pattern)是结构型设计模式中的一种,它允许你通过将对象封装在一个新的对象中,来动态地添加新的功能,而无需改变原对象的结构。装饰器模式的核心思想是“将功能附加到对象上”,它是一种…