C# 动态加载dll

news2025/2/27 11:11:53

 方式1

using System;
using System.Reflection;
 
class Program
{
    static void Main()
    {
        string dllPath = "path/to/your/library.dll"; // 替换为你的DLL文件路径
        Assembly myAssembly = Assembly.LoadFile(dllPath);
        Type myType = myAssembly.GetType("YourNamespace.YourClass"); // 替换为你的类型名称
        object myInstance = Activator.CreateInstance(myType);
 
        // 调用DLL中的方法
        MethodInfo myMethod = myType.GetMethod("YourMethod"); // 替换为你的方法名称
        myMethod.Invoke(myInstance, null); // 如果方法不需要参数,使用null,否则提供适当的参数数组
 
        Console.WriteLine("DLL方法已被调用。");
    }
}

方式二 

 [DllImport("C:\\Program Files\\****\\****.dll")]
internal static extern int Function(int Code);

以上方式发现dll的路径是固定的,我们通过以下方式可以成功加载dll

var path = Environment.GetEnvironmentVariable("PATH");
if (path != null)
{
    path = path.TrimEnd(';')+";";
    var ProBinDir = "";//指定路径或者从注册表中获取
    if (ProBinDir != null)
        Environment.SetEnvironmentVariable("PATH", path += $"{ProBinDir}\\bin;");
    else
        Trace.TraceError("获取路径失败");
}
[DllImport("****.dll")]
internal static extern int Function(int Code);

实例

整体文件

步骤

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ZWH
{
    public class Class1
    {
        public void putoutZWH() 
        {
            Console.WriteLine("ZWH");
        }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp20
{
    internal class Program
    {
        static void Main(string[] args)
        {
            // 加载 ZWH.dll 程序集
            Assembly assembly = Assembly.LoadFrom("E:\\workspace\\ConsoleApp20\\ZWH\\bin\\Debug\\ZWH.dll");

            // 获取 ZWH.Class1 类型
            Type type = assembly.GetType("ZWH.Class1");

            // 创建 ZWH.Class1 的实例
            object obj = Activator.CreateInstance(type);

            // 获取 putoutZWH 方法的 MethodInfo
            MethodInfo method = type.GetMethod("putoutZWH");

            // 调用 putoutZWH 方法
            method.Invoke(obj, null);

            // 等待用户按下任意键退出程序
            Console.ReadKey();
        }
    }
}

 结果

参考文献

C#动态调用DLL_c# 动态加载dll-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1608588.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaSE高阶篇-反射

第一部分、Junit单元测试 1)介绍 1.概述:Junit是一个单元测试框架,在一定程度上可以代替main方法,可以单独去执行一个方法,测试该方法是否能跑通,但是Junit是第三方工具,所以使用之前需要导入jar包 2)Junit的基本使用(重点啊) 1.…

Nuclei 减少漏报的使用小技巧

在最近工作的渗透测试项目中发现Nuclei存在一个问题,就是相同的网站连续扫描多次会出现漏报的情况,此前没有注意过这个情况,所以写篇文章记录一下。 在此之前我的常用命令都是一把梭,有就有没有就继续其他测试 $ nuclei -u htt…

视觉位置识别与多模态导航规划

前言 机器人感知决策是机器人移动的前提,机器人需要对周围环境实现理解,而周围环境通常由静态环境与动态环境构成。机器人在初始状态或者重启时需要确定当前所处的位置,然后根据用户的指令或意图,开展相应移动或抓取操作。通过视觉…

OpenHarmony开发——Makefile方式组织编译的库移植

以yxml库为例,其移植过程如下文所示。 源码获取 从仓库获取yxml源码,其目录结构如下表: 表1 源码目录结构 名称描述yxml/bench/benchmark相关代码yxml/test/测试输入输出文件,及测试脚本yxml/Makefile编译组织文件yxml/.gitat…

IOC

获取资源的传统方式: 在应用程序中的组件需要获取资源时,传统的方式是组件主动的从容器中获取所需要的资源,在这样的模式下开发人员往往需要知道在具体容器中特定资源的获取方式,增加了学习成本,同时降低了开发效率。…

【系统分析师】项目管理

文章目录 1、范围管理2、时间(进度)管理【重点】2.0 活动资源估算2.1 进度控制2.2 关键路径法2.2.1 单代号网络图2.2.2 双代号网络图2.2.3 自由时差2.2.4 甘特图 3、配置管理3.1 配置项/配置库3.2 变更控制3.3 版本管理 4、质量管理5、成本管理5.1 成本管理的概念5.2 挣值管理 …

算法部署 | 使用TensorRT在Jetson-Xavier-AGX上部署YOLOv4目标检测算法

项目应用场景 面向 NVIDIA Jetson Xavier AGX 平台部署 YOLOv4 目标检测算法场景,项目采用 TensorRT 进行 GPU 算法加速推理。 项目效果 项目细节 > 具体参见项目 README.md (1) 安装依赖 Install pycuda (takes awhile) $ cd ${HOME}/catkin_ws/src/yolov4_tr…

记录汇川:五个ST案例

起保停: 简单数学教学: 数据查找: 按钮检测: 数据堆栈:

16.C++常用的算法_算数生成算法

文章目录 遍历算法1. accumulate()代码工程运行结果 2. fill()代码工程运行结果 遍历算法 1. accumulate() 代码工程 第三个参数为累加的起始值&#xff0c;如果没有特殊需求写0即可; 需要注意包含头文件#include<numeric>#define _CRT_SECURE_NO_WARNINGS #include&l…

中颖51芯片学习7. ADC模数转换

中颖51芯片学习7. ADC模数转换 一、ADC工作原理简介1. 概念2. ADC实现方式3. 基准电压 二、中颖芯片ADC功能介绍1. 中颖芯片ADC特性2. ADC触发源&#xff08;1&#xff09;**软件触发**&#xff08;2&#xff09;**TIMER4定时器触发**&#xff08;3&#xff09;**外部中断2触发…

性能优化工具

CPU 优化的各类工具 network netperf 服务端&#xff1a; $ netserver Starting netserver with host IN(6)ADDR_ANY port 12865 and family AF_UNSPEC$ cat netperf.sh #!/bin/bash count$1 for ((i1;i<count;i)) doecho "Instance:$i-------"# 下方命令可以…

Java项目引入log4j2

log4j2 单独使用 引入依赖 <dependencies><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>2.14.0</version></dependency><dependency><groupId>o…

逆滤波器的推导与实现

设滤波器为&#xff0c;逆滤波器为 根据滤波器和逆滤波器的定义 对上式做傅里叶变换 对上式做逆傅里叶变换可得&#xff0c; 好了&#xff0c;逆滤波器的公式推导完了&#xff0c;但是实际计算时大多数时候这样是算不出来的&#xff0c;除非像扫频或粉噪这样的全频带信号才行&…

交流电转直流电5V500mA恒压芯片WT5104

交流电转直流电5V500mA恒压芯片WT5104 WT5104恒压芯片&#xff0c;是一种将交流电转换为直流电的设备。它的工作原理是通过内部的电路设计&#xff0c;将输入的交流电进行整流、滤波后&#xff0c;输出稳定的直流电。这款芯片最大的特点就是能够提供恒定的电压和电流&#xff…

鸿蒙 UI预览报错

SyntaxError: Unexpected end of JSON input 删除entry下的.preview文件 重新刷新预览

Ubuntu上阅读Android源码工具

由于Android源码过于庞杂&#xff0c;里面有多种语言源文件&#xff0c;想只用一IDE统一索引是不现实的。我个人便使用AS阅读JAVA代码&#xff0c;VS看C/C代码&#xff0c;在Ubuntu上不能使用SI&#xff0c;所以直接放弃。在framework开发这个层面上来讲&#xff0c;因为大部分…

C++:Hash应用【位图与布隆过滤器】

什么是位图&#xff1f; 我们先来看一个问题&#xff1a; 给40亿个不重复的无符号整数&#xff0c;没排过序。给一个无符号整数&#xff0c;如何快速判断一个数是否在 这40亿个数中。【腾讯】 如果我们使用unordered_set容器来解决&#xff0c;40亿个数据&#xff0c;每个数据…

CorelDRAW2024平面设计软件主要功能讲解

CorelDRAW是加拿大Corel公司出品的平面设计软件&#xff0c;也是一款功能强大的矢量图形制作和排版软件&#xff0c;主要面向绘图设计师和印刷输出人员。该软件提供了矢量动画、页面设计、网站制作、位图编辑和网页动画等多种功能。 CorelDRAW软件的主要用途是创建和编辑矢量图…

【Linux学习笔记】安卓设置内核信息的打印级别

开发环境 开发板&#xff1a;正点原子RK3568开发板安卓版本&#xff1a;11 问题描述 在串口调试过程中经常打印出这样的一些信息 极影响调试&#xff0c;暂时又没什么用&#xff0c;有些时候还不能给它直接关了。尤其是这个信息 healthd: battery l50 v3 t2.6 h2 st3 fc10…

mysql 重复单号 统计

任务&#xff1a; 增加重复件统计分析&#xff1a; 统计展示选择时间范围内重复1次、重复2次、重复3次、重复4次、重复5次及以上的数据量 17、统计出现的重复次数 增加重复件统计分析&#xff1a; 统计展示选择时间范围内重复1次、重复2次、重复3次、重复4次、重复5次及以上的数…