一.新建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++函数的更多相关文章

  1. ng-repeat循环出来的部分调用同一个函数并且实现每个模块之间不能相互干扰

    使用场景:用ng-repeat几个部分,每个部分调用同一个函数,但是每个模块之间的功能不能相互干扰 问题:在用repeat实现.content块repeat的时候打算这样做:新建一个空的数组(nmbe ...

  2. 深入理解javascript系列(4):立即调用的函数表达式

    本文来自汤姆大叔 前言 大家学JavaScript的时候,经常遇到自执行匿名函数的代码,今天我们主要就来想想说一下自执行. 在详细了解这个之前,我们来谈了解一下“自执行”这个叫法,本文对这个功能的叫法 ...

  3. EC笔记,第二部分:9.不在构造、析构函数中调用虚函数

    9.不在构造.析构函数中调用虚函数 1.在构造函数和析构函数中调用虚函数会产生什么结果呢? #; } 上述程序会产生什么样的输出呢? 你一定会以为会输出: cls2 make cls2 delete ...

  4. EC笔记,第二部分:5.了解C++默默编写并调用哪些函数

    5.了解C++默默编写并调用哪些函数 1.C++空类 C++会为一个空类建立以下函数 (1).默认构造函数 (2).默认拷贝构造函数 (3).析构函数 (4).赋值运算符(如果成员包含引用类型或con ...

  5. C++构造函数中不能调用虚函数

    在构造函数中调用虚函数,并不会产生多态的效果,就跟普通函数一样. c++ primer 第四版中497页15.4.5构造函数和析构中的虚函数讲到,如果在构造函数或析构函数中调用虚函数,则运行的是为构造 ...

  6. ZeroMQ接口函数之 :zmq_errno – 返回errno的值给调用此函数的线程

    ZeroMQ 官方地址 :http://api.zeromq.org/4-0:zmq_errno zmq_errno(3)         ØMQ Manual - ØMQ/3.2.5 Name zm ...

  7. cocos2dx 3.x(获得父类的node型指针调用父类函数this->getParent())

    void CenterLayer::zhanzheng(CCObject* pSender){ ((GameScene*)this->getParent())->showLayer(Gam ...

  8. 09——绝不在构造和析构函数中调用virtual函数

    在base class构造期间,virtual函数不是virtual函数. 构造函数.析构函数中不要调用virtual函数.

  9. LR常用函数以及调用自定义函数

    2.LR常用函数以及调用自定义函数 2.1.LR常用函数以及对信息的判断 2.1.1. LR内部自定义函数 在LR脚本中定义变量和编写自定义函数,需将变量的声明放在脚本其他内容的上方,否则会提示[il ...

  10. lua如何调用C++函数

    第一步是定义函数.所有在Lua中被调用的C/C++函数将使用下面一类指针进行调用: typedef int (*lua_CFunction) (lua_State *L); 换句话说,函数必须要以Lu ...

随机推荐

  1. linux MD5 SHA1 等 文件校验方法

    为解决官方发布的软件包被别人更改或者软件在传输过程中出现传输错误等问题,软件官方在提供软件包的同时,还提供一个保存MD5校验码的文件. Linux/unix中可以使用 md5sum 文件名 sha1s ...

  2. 自定义 checkbox 样式

    前言:最近在做一个网站,为了统一风格,需要自定义checkbox的样式.所以花了点时间参考了 研究了一下.感觉上面的方法略微麻烦.所以自己重新写了下面的代码,欢迎大家指教.同时,感谢w3cplus提供 ...

  3. JavaScript设计模式-3.原型模式

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  4. java算法----------二叉树的遍历

    二叉树的遍历分为前序.中序.后序和层序遍历四种方式 首先先定义一个二叉树的节点 //二叉树节点 public class BinaryTreeNode { private int data; priv ...

  5. AngularJS 的常用特性(二)

    3.列表.表格以及其他迭代型元素 ng-repeat可能是最有用的 Angular 指令了,它可以根据集合中的项目一次创建一组元素的多份拷贝. 比如一个学生名册系统需要从服务器上获取学生信息,目前先把 ...

  6. [中英对照]How PCI Express Works | PCIe工作原理

    How PCI Express Works | PCIe工作原理 PCI Express is a high-speed serial connection that operates more li ...

  7. ES6 读书笔记

    一.let和const命令 二.变量的解构赋值 三.字符串的扩展 四.数值的扩展 五.正则的扩展 六.数组的扩展 七.函数的扩展 八.对象的扩展 九.symbol 十.proxy和reflect 十一 ...

  8. JDK1.7新特性(1):Switch和数字

    Switch jdk1.7的switch语句增加了对字符串类型的支持.其实现的原理是通过字符串的hash值来比较的,代码示例如下: String name = "KiDe"; // ...

  9. Android四大组件--活动(Activity)

    1. 概念 说明: 1). 创建和销毁 onCreate 和 onDestory 应用场景:当界面销毁的时候存储一些数据,在onCreate创建的时候回显数据: 例如:发短信:写短信写到一半,按hom ...

  10. 面向对象(基础oop)之属性与构造函数

    大家好,我叫李京阳,,很高兴认识大家,之所以我想开一个自己的博客,就是来把自己所了解的知识点通过自己的话写一下,希望被博客园的朋友们点评和一起讨论一下,也希望从博客园中多认识一些软件开发人员!现在我开 ...