C#调用非托管代码(C++方法)的2种方式
第一种:静态调用
使用using System.Runtime.InteropServices命名空间下的DllImport标签指定非托管的Dll及其细节
方法必须是静态的即必须加上static关键字,还有extern关键字
[DllImport("kernel32.dll", EntryPoint = "GetSystemDefaultLCID")]static extern ushort GetSystemDefaultLCID();//OS 当前选择的默认语言(区域-管理)[DllImport("kernel32.dll", EntryPoint = "GetSystemDefaultLangID")]static extern ushort GetSystemDefaultLangID();//OS 当前选择的默认语言(区域-管理)
调用时与普通的静态方法一致;
第二种:动态加载
动态加载时需要使用的一些非托管代码
//装载动态库[DllImport("kernel32.dll")]static extern IntPtr LoadLibrary(string lpFileName);//获取要引入的函数[DllImport("kernel32.dll")]static extern IntPtr GetProcAddress(IntPtr hModule, string lpProcName);//释放动态链接库[DllImport("kernel32.dll", EntryPoint = "FreeLibrary", SetLastError = true)]static extern bool FreeLibrary(IntPtr hModule);
首先定义相应的代理对应的非托管代码(dll)中的相关方法(我们需要的方法)
public delegate int dicCreateHDICT(int dwWordLangID, string lpcszIdxFileName, string lpcszDatFileName);public delegate bool dicFreeHDICT(int hdict);
再动态加载非托管代码
public class DLLHandler{[DllImport("kernel32.dll")]static extern IntPtr LoadLibrary(string lpFileName);//获取要引入的函数[DllImport("kernel32.dll")]static extern IntPtr GetProcAddress(IntPtr hModule, string lpProcName);//释放动态链接库[DllImport("kernel32.dll", EntryPoint = "FreeLibrary", SetLastError = true)]static extern bool FreeLibrary(IntPtr hModule);//DrDicEnt.dllpublic static dicCreateHDICT dictCreateDICT = null;public static dicFreeHDICT dictFreeDict = null;public static void Init(){IntPtr hLib=LoadLibrary(@"D:\Dll\DrDicEnt.dll");IntPtr api = GetProcAddress(hLib,"dicCreateHDICT");dictCreateDICT = (dicCreateHDICT)Marshal.GetDelegateForFunctionPointer(api,typeof(dicCreateHDICT));IntPtr api2 = GetProcAddress(hLib,"dicFreeHDICT");dicFreeHDICT= (dicFreeHDICT)Marshal.GetDelegateForFunctionPointer(api2,typeof(dicFreeHDICT)); }
调用时先DLLHandler.Init();
再使用DLLHandler.dicCreateHDICT()等方法
转载于:https://www.cnblogs.com/wxj111/archive/2013/05/14/3077943.html
C#调用非托管代码(C++方法)的2种方式相关推荐
- Java调用.NET webservice方法的几种方式
最近做项目,涉及到web-service调用,现学了一个星期,现简单的做一个小结.下面实现的是对传喜物流系统(http://vip.cxcod.com/PodApi/GetPodStr.asmx?ws ...
- Vue组件之间传值/调用方法的几种方式
组件之间传值/调用方法的几种方式 (一)父组件向子组件传值==props 1.在父组件中使用子组件的地方绑定数据 <children :message="message"&g ...
- Py之qrcode:调用python的qrcode库两种方式生成二维码、带logo的二维码
Py之qrcode:调用python的qrcode库两种方式生成二维码.带logo的二维码 目录 python编程实现生成二维码 1.第一种方式-纯文本 2.第二种方式-带logo
- python rest api_Python调用REST API接口的几种方式汇总
相信做过自动化运维的同学都用过REST API接口来完成某些动作.API是一套成熟系统所必需的接口,可以被其他系统或脚本来调用,这也是自动化运维的必修课. 本文主要介绍python中调用REST AP ...
- Java中调用方法的几种方式
一般的,在Java语言中,调用方法有三种方式. 第一种:通过对象名.方法名进行调用,这是最普通的也是最常见的一种调用方式. 第二种:通过new关键字调用构造方法,这种是在实例化对象时使用的方式. 第三 ...
- 04.React事件 方法、 React定义方法的几种方式 获取数据 改变数据 执行方法传值...
2019独角兽企业重金招聘Python工程师标准>>> 一.基本用法 在以类继承的方式定义的组件中,为了能方便地调用当前组件的其他成员方法或属性(如:this.state),通常需要 ...
- java native函数库_Java 层调用 Native 层函数的两种方式
概述 Java 层如何调用Native层函数,大家都应该知道使用JNI(Java 本地接口). 通过在java层声明native方法,然后遵守JNI规范命名Native函数,即可建立Java层nati ...
- JS 定义方法的三种方式
JS函数的定义与调用方法 JS函数调用的四种方法:方法调用模式,函数调用模式,构造器调用模式,apply,call调用模式 1.方法调用模式: 先定义一个对象,然后在对象的属性中定义方法,通过myob ...
- Java项目启动时执行指定方法的几种方式
版权声明:本文为博主原创文章,未经博主允许不得转载.博客源地址为zhixiang.org.cn https://blog.csdn.net/myFirstCN/article/details/8175 ...
- jquery读取json文件跨域_跨域方法的若干种方式
一.跨域的解释 那什么是跨域呢,简单地理解就是因为JavaScript同源策略的限制, a.com 域名下的js无法操作 b.com 或是 c.a.com 域名下的对象.当协议.子域名.主域名.端口号 ...
最新文章
- mysql nextval同步锁_mysql中实现类似oracle中的nextval函数
- 获取某个时间开始 之后的 N次[周几,周几]
- 【转】 Android 屏幕切换总结
- 项目:NMEA2000的数据格式解析
- bootstrap table 分页只显示分页不显示总页数等数据
- 怎么把matlab 训练的model 保存下来 然后在opencv 中调用
- div显示图片_图片按照百分比显示部分,不变形
- wordpress 表格文字对齐_不要再用空格来对齐Word文字了,这样做,3秒对齐所有Word文字...
- 【对讲机的那点事】安装中继台天馈系统如何制作同轴电缆BNC接头?
- always on sql 收缩日志_啥?我写的一条SQL让公司网站瘫痪了...
- 论文阅读 视频生成(vid2vid) || Few-shot Video-to-Video Synthesis
- 伪随机数的产生和流密码
- 电脑浏览器主页面被恶意劫持无法修改的解决方法
- 联邦学习纵向逻辑回归公式推导
- Flutter 左右菜单联动
- 常见中文字体英文名称以及windows默认字体类型
- Vulnhub-Earth
- 如何理解GPU中的SIMT(单指令流多线程模型)
- 实现同网段不同vlan通信有几种方式?纯二层网络下又是如何实现的?
- dz论坛php5,S!淘专辑 3.0.1 For php5.2 php5.3版 dz插件分享,淘专辑是用户将喜欢的论坛帖子...