托管非托管Dll动态调用
原文:托管非托管Dll动态调用
最近经常看到有人问托管非托管Dll调用的问题。对于动态库的调用其实很简单。网上很多代码都实现了Dll的静态调用方法。我主要谈论下动态库的动态加载。
对于托管动态库,实现动态加载很简单。
Code= Assembly.LoadFile(filePath);//这里是动态库的路径。
Type tp = ass.GetType(dllType);//dllType是你所需要调用的动态库文件的命名空间+类名(NameSpace.Class)
MethodInfo method = tp.GetMethod(function);//需要执行的函数
object ob = Activator.CreateInstance(tp);//创建对象
method.Invoke(ob, null);//执行函数,后一个参数即为执行函数需要的参数,若无则为null。
对于非托管dll的调用。相对托管动态库来说麻烦一点,但是也是很简单的。
使用三个API函数:LoadLibrary,GetProcAddress,FreeLibrary。
使用LoadLibrary将非托管Dll加载到内存中。调用GetProcAddress获取需调用的函数指针。将非托管函数指针转换为委托即可。最后调用FreeLibrary释放加载加载的非托管内存(加载后必须释放非托管内存)。
Code System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
namespace DllTest
{
public class DllInvoke
{
[DllImport("Kernel32.dll")]
private static extern IntPtr LoadLibrary(string path);
[DllImport("Kernel32.dll")]
private static extern IntPtr GetProcAddress(IntPtr lib,string FunName);
[DllImport("kernel32.dll")]
public static extern bool FreeLibrary(IntPtr lib);
private IntPtr libr;
public DllInvoke(string path)
{
libr = LoadLibrary(path);
}
public Delegate Invoke(string funName, Type type)
{
IntPtr api = GetProcAddress(libr, funName);
return (Delegate)Marshal.GetDelegateForFunctionPointer(api, type);
}
~DllInvoke()
{
FreeLibrary(libr);//释放。必须的
}
}
}
完成上面的函数声明后,接着我们先定一个委托.
Code delegate bool doDllFunction();//如果需要执行的函数有参数,可对之进行声明。
DllInvoke dllInvoke = new DllInvoke(filePath);//非托管dll文件路径
doDllFunction show = (doDllFunction) dllInvoke.Invoke(InitFunction,typeof(doDllFunction));// InitFunction为需要执行的函数名
show();//执行方法,可根据定义决定是否需要传参数
托管非托管Dll动态调用的更多相关文章
- .Net 程序在自定义位置查找托管/非托管 dll 的几种方法
原文:.Net 程序在自定义位置查找托管/非托管 dll 的几种方法 一.自定义托管 dll 程序集的查找位置 目前(.Net4.7)能用的有2种: #define DEFAULT_IMPLEMENT ...
- Delphi 类库(DLL)动态调用与静态调用示例讲解
在Delphi或者其它程序中我们经常需要调用别人写好的DLL类库,下面直接上示例代码演示如何进行动态和静态的调用方法: { ************************************** ...
- Delphi Dll 动态调用例子(3)-仔细看一下
http://blog.163.com/bxf_0011/blog/static/35420330200952075114318/ Delphi 动态链接库的动态和静态调用 为了让人能快速的理解 静态 ...
- C# 托管非托管资源释放
1.C#几乎所有对象都为托管对象,不同点是有的对象封装了非托管资源. 2.C#大部分对象在进行垃圾回收时都可以回收,包括非托管资源,因为非托管资源都已经通过C#类进行了封装,会将非托管资源的释放放在析 ...
- Delphi Dll 动态调用例子(2)
http://zhidao.baidu.com/question/157196792.html delphi动态调用DLL 写了个1.dll内容如下 library Project2; uses Sy ...
- Delphi Dll 动态调用例子(1)
http://blog.sina.com.cn/s/blog_62c46c3701010q7h.html 一.编写dll library TestDllByD2007; uses SysUtils, ...
- C#的托管与非托管大难点
托管代码与非托管代码 众所周知,我们正常编程所用的高级语言,是无法被计算机识别的.需要先将高级语言翻译为机器语言,才能被机器理解和运行.在标准C/C++中,编译过程是这样的:源代码首先经过预处理器,对 ...
- C#的三大难点之二:托管与非托管
相关文章: C#的三大难点之前传:什么时候应该使用C#?C#的三大难点之一:byte与char,string与StringBuilderC#的三大难点之二:托管与非托管C#的三大难点之三:消息与事件 ...
- C++调用DLL有两种方法——静态调用和动态调用
C++调用DLL有两种方法——静态调用和动态调用 标签: dllc++winapinullc 2011-09-09 09:49 11609人阅读 评论(0) 收藏 举报 分类: cpp(30) [ ...
随机推荐
- 到2023年将会有超过90%的PC采用SSD硬盘
本文转载自超能网,其他媒体转载需经超能网同意 现在买电脑或者自己装机,还有谁不要SSD硬盘吗?这个问题似乎没什么可说的,SSD硬盘各种好,装机可以说是必选了,但实际上现在的SSD适配率并没有想象中那么 ...
- 【转】 java RSA加密解密实现
[转] java RSA加密解密实现 该工具类中用到了BASE64,需要借助第三方类库:javabase64-1.3.1.jar 下载地址:http://download.csdn.net/detai ...
- UITableView去掉最后切割线的一种方法
UITableView以style:UITableViewStylePlain方式创建时.仅仅要有cell,就会有一条黑线 哪怕至于一个cell也会有,如图 在网上找了集中方法,都不好使,比方http ...
- Linux打包免安装的Qt程序(编写导出依赖包的脚本copylib.sh,程序启动脚本MyApp.sh)
本文介绍如何打包Qt程序,使其在没有安装Qt的系统可以运行. 默认前提:另外一个系统和本系统是同一个系统版本. 1,编写导出依赖包的脚本copylib.sh #!/bin/bash LibDir=$P ...
- SQL Search
Press TAB to expand wildcard tab键之后,会自动展开,直接枚举表中所有的字段 根据名字查找存储过程,发现找不到 原因是,本地是一个备份库.服务器上通过sql source ...
- 7.第一次使用java连接mongodb遇到的问题
转自:https://blog.csdn.net/u010523770/article/details/54585883 新版本的mongodb的驱动包是依赖bson.jar和mongodb_driv ...
- Sqoop Export原理和详细流程讲解
Sqoop Export原理 Sqoop Export详细流程讲解
- Sandbox
Sandbox Contents Overview Design principles Sandbox windows architecture The broker process The targ ...
- 硬件时间,操作系统时间,Windows 和linux 双系统时间差8小时问题说明
1.硬件时间:硬件时钟是存储在主板上CMOS里的时间即BIOS时间,关机后该时钟依然运行,主板的电池为它供电.对应于嵌入式设备有一个RTC模块.硬件时钟即RTC时钟.信息比较少没时区.夏令时的概念. ...
- mysql分页小结
mysql.select('*').from('books') .join('cSessionInfo', 'books.openid', 'cSessionInfo.open_id') .limit ...