P/Invoke:C#调用C++
P/Invoke的全称是Platform Invoke (平台调用) 它实际上是一种函数调用机制通 过P/Invoke我们就可以调用非托管DLL中的函数。
P/Invoke依次执行以下操作:
1. 查找包含该函数的非托管DLL
2. 将该非托管DLL加载到内存中
3. 查找函数在内存中的地址并将其参数按照函数的调用约定压栈
4. 将控制权转移给非托管函数
步骤:
1. 建立"Win32 Project -> DLL" application。

2. 编C++类及调用函数:
"cpp.h"
class Student
{
public:
int getNumber(int i);
}; extern "C" __declspec(dllexport) int _stdcall getStuNumber(int i);
"cpp.cpp"
#include "stdafx.h"
#include "Cpp.h" int Student::getNumber(int i)
{
return i+;
} extern "C" _declspec(dllexport) int _stdcall getStuNumber(int i) {
Student stu;
return stu.getNumber(i);
}
extern "C" : extern "C"使得在C++中使用C编译方式成为可能。在“C++”下定义“C”函数,需要加extern “C”关键词。用extern "C"来指明该函数使用C编译方式。
__declspec(dllexport): 将一个函数声名为导出函数。
_stdcall :以标准方式调用,起到查找入口点的作用。
3. 编C#调用
using System;
using System.Runtime.InteropServices;
namespace CSharp
{
public class CppInvoke
{
[DllImport("CPP.dll", CallingConvention=CallingConvention.StdCall)]
public static extern int getStuNumber(int i);
} class Program
{
static void Main(string[] args)
{
int j = CppInvoke.getStuNumber();
Console.WriteLine(j);
Console.ReadLine();
}
}
}
DllImport: 用来标识该方法是非托管的代码方法,在编译器编译的时候它能够正确的认识出被该特性标记的是外来代码段。当到达程序运行的时候,也能够正确的认识出该代码是引用非托管的代码,这样CLR会去加载非托管DLL文件,然后查找到入口点进行调用。
CallingConvention:在平台调用的过程中起到查找入口点的作用,在托管代码进行非托管代码入口点查找时,会通过CallingConvention中的值进行确认非托管入口点的调用约定。此项也可省略。
4. 设置输出路径,调试选项:
a. 将C++Project的“output directory” 和C#project的“output path” 设置在同一目录,这样以遍 C#程序能够找到C++ DLL.
b. 选上 "Enable unmanaged code debugging"选项,以便调试时候跟踪到C++程序。

好了。可以执行程序,看执行结果了。
P/Invoke:C#调用C++的更多相关文章
- AutoCAD.NET 不使用P/Invoke方式调用acad.exe或accore.dll中的接口(如acedCommand、acedPostCommand等)
		
使用C#进行AutoCAD二次开发,有时候由于C#接口不够完善,或者低版本AutoCAD中的接口缺少,有些工作不能直接通过C#接口来实现,所以需要通过P/Invoke的方式调用AutoCAD的其他DL ...
 - Java 反射 Method的invoke回调调用任意方法
		
Java 反射 Method的invoke回调调用任意方法 @author ixenos 关键子:Method.Field.invoke方法指针/函数指针.回调函数 invoke回调流程示例 0.由C ...
 - .netcore在linux下使用P/invoke方式调用linux动态库
		
http://www.mamicode.com/info-detail-2358309.html .netcore下已经实现了通过p/invoke方式调用linux的动态链接库(*.so)文件 1 ...
 - P/Invoke   .NET调用win32API
		
项目:无线无源测温软件系统 项目中,用到使用P/Invoke在.NET调用win32API,实现对ini配置文件的读写功能!因为有一些配置信息需要保存下来,以便在下一次启动程序完成初始化,这实际上是一 ...
 - BackGroundWorker组件使用、Winform控件的Invoke安全调用
		
BackgroundWorker是·net里用来执行多线程任务的控件,它允许编程者在一个单独的线程上执行一些操作. 可以通过编程方式创建 BackgroundWorker,也可以将它从"工具 ...
 - 转:在 C# 中使用 P/Invoke 调用 Mupdf 函数库显示 PDF 文档
		
在 C# 中使用 P/Invoke 调用 Mupdf 函数库显示 PDF 文档 一直以来,我都想为 PDF 补丁丁添加一个 PDF 渲染引擎.可是,目前并没有可以在 .NET 框架上运行的免费 PDF ...
 - 在 C# 中通过 P/Invoke 调用Win32 DLL
		
在 C# 中通过 P/Invoke 调用Win32 DLL 发布日期 : 1/13/2005 | 更新日期 : 1/13/2005 Jason Clark 下载本文的代码: NET0307.exe ( ...
 - 多线程、委托、Invoke解决winform界面卡死的问题,并带开关
		
一.知识点介绍 1,更新控件的内容,应该调用控件的Invoke方法. Invoke指: 在拥有控件的基础窗口句柄的线程上,用指定的参数列表执行指定委托.该方法接收一个委托类型和委托的参数,因此需要定义 ...
 - Atitit 动态调用webservice与客户端代理方式调用
		
Atitit 动态调用webservice与客户端代理方式调用 方式1: 使用call.invoke 直接调用WSDL,缺点:麻烦,不推荐--特别是JAVA调用.NET的WS时,会有不少的问题需要解 ...
 - C++如何调用C#开发的dll
		
序言 本文介绍一个C++如何调用C#开发的dll实例. 前言 C++编写的程序为非托管代码,C#编写的程序为托管代码.托管代码虽然提供了其他开发平台没有的许多优势,但由于前期系统及历史版本很多使用的是 ...
 
随机推荐
- Akka.net路径里的user
			
因为经常买双色球,嫌每次对彩票号麻烦,于是休息的时候做了个双色球兑奖的小程序,做完了发现业务还挺复杂的,于是改DDD重做设计,拆分服务,各种折腾...,不过这和本随笔没多大关系,等差不多了再总结一下, ...
 - java中的锁
			
java中有哪些锁 这个问题在我看了一遍<java并发编程>后尽然无法回答,说明自己对于锁的概念了解的不够.于是再次翻看了一下书里的内容,突然有点打开脑门的感觉.看来确实是要学习的最好方式 ...
 - 为什么 NaN 不等于自身?
			
NaN 即Not a Number , 不是一个数字, 那么NaN到底是什么呢? 话说在JavaScript中,有6大数据类型,分别包括string,number,boolean,undefined, ...
 - 探索C#之6.0语法糖剖析
			
阅读目录: 自动属性默认初始化 自动只读属性默认初始化 表达式为主体的函数 表达式为主体的属性(赋值) 静态类导入 Null条件运算符 字符串格式化 索引初始化 异常过滤器when catch和fin ...
 - wordpress多站点配置
			
wordpress作为全球第一的个人博客搭建平台一直在国内外有着较高的人气,从3.0版本开始就已经支持多站点的搭建.该功能可以让子站点运行主站点的程序,不需要再每个站点分别存放网站程序.最近更新的4. ...
 - 从零开始编写自己的C#框架(26)——小结
			
一直想写个总结,不过实在太忙了,所以一直拖啊拖啊,拖到现在,不过也好,有了这段时间的沉淀,发现自己又有了小小的进步.哈哈...... 原想框架开发的相关开发步骤.文档.代码.功能.部署等都简单的讲过了 ...
 - 理解nodejs模块的scope
			
描述 原文档地址:https://docs.npmjs.com/misc/scope 所有npm模块都有name,有的模块的name还有scope.scope的命名规则和name差不多,同样不能有ur ...
 - WebForm获取GET或者POST参数到实体的转换,ADO.NET数据集自动转换实体
			
最近在修改维护以前的webform项目(维护别人开发的.....)整个aspx没有用到任何的控件,这个我也比较喜欢不用控件所以在提交信息的时候需要自己手动的去Request.QueryString[] ...
 - C#反序列化XML异常:在 XML文档(0, 0)中有一个错误“缺少根元素”
			
Q: 在反序列化 Xml 字符串为 Xml 对象时,抛出如下异常. 即在 XML文档(0, 0)中有一个错误:缺少根元素. A: 首先看下代码: StringBuilder sb = new Stri ...
 - webix前端架构的项目应用
			
webix框架兼容javascript.HTML.CSS,应用比较灵活,应用框架时,配合后台webAPI,整个web项目里面,App文件夹保存前台的多语言文件,图片文件,webix原代码js.css, ...