C#调用C++函数
一.新建C++项目
1.在VS2012中新建->项目->模版->其他语言->Win32->Win32项目->下一步->选DLL,导出符号。
2.在XX.h项目中删除所有内容,将一下代码贴进去。
#define TESTCPPDLL_API __declspec(dllexport)
extern "C" TESTCPPDLL_API int __stdcall Add(int* a, int* b );
extern "C" TESTCPPDLL_API char __stdcall QQ(unsigned char* userContent); extern "C" TESTCPPDLL_API char* __stdcall QQ2(char* userContent);
extern "C" TESTCPPDLL_API int __stdcall QQ3(HANDLE* h);
3.在XX.cpp文件中,删除所有内容。贴入如下代码
#include "stdafx.h"
#include "WW.h" TESTCPPDLL_API int __stdcall Add(int* a, int* b)
{
*b = ;
return *a + *b;
}
TESTCPPDLL_API char __stdcall QQ(unsigned char* userContent)
{
return userContent[];
}
TESTCPPDLL_API char* __stdcall QQ2(char* userContent) { return userContent; }
TESTCPPDLL_API int __stdcall QQ3(HANDLE* h) { *h = new HANDLE(); return 5; }
4.右键项目->属性->配置属性-> C/C++ -> 高级 ->编译为 选择编译为C++代码(/TP)。
5.右键项目,点击编译。生成dll(XX.dll 在 XX\Debug\目录下)
二.C#调用
static class Program
{
[DllImport(@"D:\我的文档\visual studio 2012\Projects\WW\Debug\WW.dll", EntryPoint = "Add")]
extern static int Add(out int a, out int b); [DllImport(@"D:\我的文档\visual studio 2012\Projects\WW\Debug\WW.dll", EntryPoint = "QQ")]
extern static byte QQ(byte[] userContent);
[DllImport(@"D:\我的文档\visual studio 2012\Projects\WW\Debug\WW.dll", EntryPoint = "QQ2")]
extern static unsafe byte* QQ2(ref byte[] userContent);
[DllImport(@"D:\我的文档\visual studio 2012\Projects\WW\Debug\WW.dll", EntryPoint = "QQ3")]
extern static int QQ3(out IntPtr h);
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{ int a = ;
int b;
int ans = Add(out a, out b); byte[] bb = new byte[];
byte qB = QQ(bb);
unsafe
{
//若C++中定义的返回值是char*则C#中不能定义成char[] 或者byte[]。只能是char* 或byte*
byte* anss = QQ2(ref bb);
byte[] buff = new byte[1024];
int i = 0;
while (anss[i] != '\0')
{
buff[i] = anss[i];
i++;
}
}
//对于C++中定义的HANDLE对象可以使用C#中的IntPtr进行操作
IntPtr p = new IntPtr(13456);
int s = QQ3(out p);
}
}
extern static int Add(out int a, out int b);
extern static byte QQ(byte[] userContent);
1.其中第一个函数中使用out a 和使用out b是一样的效果。
2.在第二个函数中直接使用byte[]数组形式就可以了。不需要指针等unsafe方式。
3.在C++中返回char*。则不能用stirng,char[]或byte[]来接收。只能使用char*或byte*来接收。
C#调用C++函数的更多相关文章
- ng-repeat循环出来的部分调用同一个函数并且实现每个模块之间不能相互干扰
使用场景:用ng-repeat几个部分,每个部分调用同一个函数,但是每个模块之间的功能不能相互干扰 问题:在用repeat实现.content块repeat的时候打算这样做:新建一个空的数组(nmbe ...
- 深入理解javascript系列(4):立即调用的函数表达式
本文来自汤姆大叔 前言 大家学JavaScript的时候,经常遇到自执行匿名函数的代码,今天我们主要就来想想说一下自执行. 在详细了解这个之前,我们来谈了解一下“自执行”这个叫法,本文对这个功能的叫法 ...
- EC笔记,第二部分:9.不在构造、析构函数中调用虚函数
9.不在构造.析构函数中调用虚函数 1.在构造函数和析构函数中调用虚函数会产生什么结果呢? #; } 上述程序会产生什么样的输出呢? 你一定会以为会输出: cls2 make cls2 delete ...
- EC笔记,第二部分:5.了解C++默默编写并调用哪些函数
5.了解C++默默编写并调用哪些函数 1.C++空类 C++会为一个空类建立以下函数 (1).默认构造函数 (2).默认拷贝构造函数 (3).析构函数 (4).赋值运算符(如果成员包含引用类型或con ...
- C++构造函数中不能调用虚函数
在构造函数中调用虚函数,并不会产生多态的效果,就跟普通函数一样. c++ primer 第四版中497页15.4.5构造函数和析构中的虚函数讲到,如果在构造函数或析构函数中调用虚函数,则运行的是为构造 ...
- ZeroMQ接口函数之 :zmq_errno – 返回errno的值给调用此函数的线程
ZeroMQ 官方地址 :http://api.zeromq.org/4-0:zmq_errno zmq_errno(3) ØMQ Manual - ØMQ/3.2.5 Name zm ...
- cocos2dx 3.x(获得父类的node型指针调用父类函数this->getParent())
void CenterLayer::zhanzheng(CCObject* pSender){ ((GameScene*)this->getParent())->showLayer(Gam ...
- 09——绝不在构造和析构函数中调用virtual函数
在base class构造期间,virtual函数不是virtual函数. 构造函数.析构函数中不要调用virtual函数.
- LR常用函数以及调用自定义函数
2.LR常用函数以及调用自定义函数 2.1.LR常用函数以及对信息的判断 2.1.1. LR内部自定义函数 在LR脚本中定义变量和编写自定义函数,需将变量的声明放在脚本其他内容的上方,否则会提示[il ...
- lua如何调用C++函数
第一步是定义函数.所有在Lua中被调用的C/C++函数将使用下面一类指针进行调用: typedef int (*lua_CFunction) (lua_State *L); 换句话说,函数必须要以Lu ...
随机推荐
- @SafeVarargs注解
被@SafeVarargs注解标注的方法必须是由static或者final修饰的方法. 使用泛型的变长参数方法产生编译器警告的示例: public static <T> T useVara ...
- CentOS7服务管理(重启,停止,自动启动命令)
我们对service和chkconfig两个命令都不陌生,systemctl 是管制服务的主要工具, 它整合了chkconfig 与 service功能于一体. systemctl is-enable ...
- mysql备份 小结 (三种方式的详细解读)
备份的本质就是将数据集另存一个副本,但是原数据会不停的发生变化,所以利用备份只能回复到数据变化之前的数据.那变化之后的呢?所以制定一个好的备份策略很重要 新建一个all.sqlvim all.sql在 ...
- DateGridView 分页显示
l 思路:将数据表整体填充至一个Dataset中,探后部分显示(DataaAdapter Fill重载) l DataGridView 控件 l BindingNavigator 控件 l B ...
- 【13】MD5编码、Zlib压缩解压缩
1.MD5加密 /// <summary> /// 使用MD5加密算法 /// </summary> /// <param name="md5MessageSt ...
- Hadoop学习笔记(10) ——搭建源码学习环境
Hadoop学习笔记(10) ——搭建源码学习环境 上一章中,我们对整个hadoop的目录及源码目录有了一个初步的了解,接下来计划深入学习一下这头神象作品了.但是看代码用什么,难不成gedit?,单步 ...
- [javaSE] 集合工具类(Collections-sort)
java为我们提供了一个集合的工具类,方便我们对集合进行操作,里面的方法都是静态方法. Collections.sort()方法,参数:List<T>集合对象,这个对象带着泛型,是为了保证 ...
- 基于SSM框架配置多数据源
项目基于ssm + maven,通过注解可以实现自动切换数据源. 一.pom.xml <?xml version="1.0" encoding="UTF-8&quo ...
- 自定义经纬度索引(非RTree、Morton Code[z order curve]、Geohash的方式)
自定义经纬度索引(非RTree.Morton Code[z order curve].Geohash的方式) Custom Indexing for Latitude-Longitude Data 网 ...
- JDBC数据库连接池
用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长.假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大的浪费数据库的资源,并且极易造成数据库 ...