P/Invoke 技术
.NET 互操作
首先推荐一本书《精通.NET 互操作》 ,这本书是目前中文资料里讲 互操作最详尽的书了。
做系统集成项目的同学应该都和设备打过交道(如视频设备:海康、大华等),在大多数情况下这些设备厂商会给系统集成厂商开发协议(dll 类库、 函数定义的头文件、测试程序、调用流程),这些协议的dll 大都用C++开发的,那么我们用C#集成,就得用 P/Invoke 技术(.NET 互操作的一种)
一、P/Invoke 简单例子
P/Invoke 说白了,就是你调用协议dll 的函数,传入正确的参数(注意C++与C#的数据类型转换)
例子:

1 using System.Runtime.InteropServices;
2
3 class App
4 {
5 [DllImport("msvcrt.dll")]
6 static extern int puts(string msg);
7
8 [DllImport("msvcrt.dll")]
9 static extern int _flushall();
10
11 static void Main()
12 {
13 puts("Hello World");
14 _flushall();
15 CreateMsgWindow();
16 }
17
18
19 [DllImport("user32.dll",EntryPoint="MessageBox")]
20 static extern int MessageBox(int hwnd,string lpText,string lpCaption,int wType);
21
22 static void CreateMsgWindow()
23 {
24 MessageBox(0,"Hello world!","Welcome",0);
25 }
26 }

二、两款 dll 函数查看工具
1. Dll Export Viewer

2. Dll 函数查看器 2.0

三、C#与C++常见类型对比
| C++ 类型 | C# 类型 |
| HANDLE (void *)括号内是等价类型 | IntPtr |
| Byte(unsigned char) | byte |
| SHORT(short) | short |
| WORD(unsigned short) | short |
| INT(int) | int |
| int* | ref int |
| UINT(unsigned int) | int |
| LONG(long) | int |
| ULONG(unsigned long) | uint |
| DWORD(unsigned long) | uint |
| BOOL(long) | bool |
| PCAHR(char *) | string |
| char[] | string |
| PBYTE(byte *) | byte[] |
| 结构体 | publlic struct 结构体{} |
| char **变量名 | ref string 变量名 |
结构体封装
附:
2. Dll Export Viewer 下载
3. Dll 函数查看器 2.0 下载
P/Invoke 技术的更多相关文章
- .NET学习之路----我对P/Invoke技术的理解(一)
看了P/Invoke技术的介绍,于是想写下点东西,东西包含两个部分:知识的纪录和我的理解及疑问. r托管代码中调用非托管API函数的过程 1.定位包含API的DLL: 2.载入DLL 3.找到DLL中 ...
- 转:在 C# 中使用 P/Invoke 调用 Mupdf 函数库显示 PDF 文档
在 C# 中使用 P/Invoke 调用 Mupdf 函数库显示 PDF 文档 一直以来,我都想为 PDF 补丁丁添加一个 PDF 渲染引擎.可是,目前并没有可以在 .NET 框架上运行的免费 PDF ...
- .Net平台互操作技术:02. 技术介绍
上一篇文章简单介绍了.Net平台互操作技术的面临的主要问题,以及主要的解决方案.本文将重点介绍使用相对较多的P/Invoke技术的实现:C#通过P/Invoke调用Native C++ Dll技术.C ...
- paip.java c# .net php python调用c++ c dll so windows api 总结
paip.java c# .net php python调用c++ c dll so windows api 总结 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来 ...
- AutoCAD/Civil 3D 学习笔记
Civil学习笔记 1.环境配置 1.添加引用: Civil二次开发需要5个基本的AutoCAD的dll引用-acdbmgd.dll, acmgd.dll, accoremgd.dll, AecBas ...
- java中调用dll文件的两种方法
一中是用JNA方法,另外是用JNative方法,两种都是转载来的, JNA地址:http://blog.csdn.net/shendl/article/details/3589676 JNativ ...
- JNA—JNI终结者
JNA—JNI终结者 介绍 给大家介绍一个最新的访问本机代码的Java框架—JNA. JNA(Java Native Access)框架是一个开源的Java框架,是SUN公司主导开发的,建立在经典的J ...
- .NET 互操作
首先推荐一本书<精通.NET 互操作> ,这本书是目前中文资料里讲 互操作最详尽的书了. 做系统集成项目的同学应该都和设备打过交道(如视频设备:海康.大华等),在大多数情况下这些设备厂商会 ...
- Xamarin原生跨平台概述(精简概述,命中要害。PS:无图)
Xamarin原生跨平台:原生界面.原生性能.原生API(与H5比较): 1.C#可以访问Andrid.IOS原生API,也可以调用C#系统类型,如Syetem,System.IO;2.原理:基于Mo ...
随机推荐
- Docker镜像使用
当运行容器时,使用的镜像如果在本地中不存在,docker 就会自动从 docker 镜像仓库中下载,默认是从 Docker Hub 公共镜像源下载. 下面我们来学习: 1.管理和使用本地 Docker ...
- Azure存储简介
注:此篇文档主要讲述微软azure全球版,并不完全试用azure中国区 azure存储是Microsoft一项托管服务,提供的云存储的可用性.安全性.持久性.可伸缩性和冗余都很高,azure存储包 ...
- Git的使用(6) —— 自动填写远端Git用户名密码
1. 问题描述 公司项目组用私服的Git远程版本库,每一次推送和拉取服务都需要输入用户名和密码,过于繁琐. 2. 解决方法 Windows系统提供了"管理Windows凭据"的功能 ...
- 记Oracle中regexp_substr的一次调优(速度提高95.5%)
项目中需要做一个船舶代理费的功能,针对代理的船进行收费,那么该功能的第一步便是选择进行代理费用信息的录入,在进行船舶选择的时候,发现加载相关船舶信息十分的慢,其主要在sql语句的执行,因为测试的时候数 ...
- Spring boot 去除URL 里的 JSESSIONID
方法一 application.yml 里设置 server: port: 80 servlet: session: tracking-modes: cookie cookie: http-only: ...
- python编译exe后在windows2003上报错
最近使用python写了一个分析nmon结果的小程序,用的是python3.8.win7环境,pyinstaller生成exe后,在win7上运行一切正常.拿到内网分享给团队成员,在windows20 ...
- centos安装jdk1.8的三种方法
一.手动解压安装包: 1.在user目录下新建java文件夹: # cd /usr/ # mkdir java # cd java 2.下载jdk1.8,进入http://www.orac ...
- GLTF模型查看器---优化器【转】
https://blog.csdn.net/weixin_43081805/article/details/88743277 Clay Viewer(我只想说好用,直接可以导出gltf的二进制glb格 ...
- Java-Maven(九):Maven 项目pom文件引入工程根目录下lib文件夹下的jar包
由于项目一些特殊需求,pom依赖的包可能是非Maven Repository下的包文件,因此无法自己从网上下载.此时,我们团队git上对该jar使用. Maven项目pom引入lib下jar包 在ec ...
- 用sublime cmd 快速打开hosts文件
:: notepad start subl "%systemdrive%\WINDOWS\system32\drivers\etc\hosts" 文章来源:刘俊涛的博客 ...