一.新建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. (转)aix非计算内存 占用过高 案例一则

    原文:http://www.talkwithtrend.com/Article/28621 两台小型机组成的RAC环境,在用topas查看资源使用情况时,发现一台机器的非计算内存占用过高: MEMOR ...

  2. python-UDP传输模型

    #!/usr/bin/python #coding=utf-8 #服务器端 from socket import * from time import ctime HOST="192.168 ...

  3. 【JVM调优系列】----CPU过高的分析与解决方案

    1.首先通过top命令查询当前进程所占cpu的一个比重

  4. mysql 递归查询 主要是对于层级关系的查询

    最近遇到了一个问题,在mysql中如何完成节点下的所有节点或节点上的所有父节点的查询?在Oracle中我们知道有一个Hierarchical Queries可以通过CONNECT BY来查询,但是,在 ...

  5. Guava之RateLimiter的设计

    Guava源码中很详尽的解释了RateLimiter的概念. 从概念上看,限流器以配置速率释放允许的请求(permit).如有必要,调用acquire()将会阻塞知道一个允许可用.一旦被获取(acqu ...

  6. 个人作业1——个人阅读&提问题

    第一部分:结缘计算机   上大学前接触了一些网游,如魔域.DNF等.偶然间朋友介绍了一些辅助软件,当时非常地好奇这些辅助软件是如何制作出来的,就上百度搜索了一些关键词,然后就了解到了易语言.VB.金山 ...

  7. 6.046 Design and Analysis of Algorithms

    课程信息 6.046 Design and Analysis of Algorithms

  8. ASP.NET MVC* 采用Unity依赖注入Controller

    Unity是微软Patterns & Practices团队所开发的一个轻量级的,并且可扩展的依赖注入(Dependency Injection)容器,它支持常用的三种依赖注入方式:构造器注入 ...

  9. golang学习之slice基本操作

    slice的增删改查: //删除 func remove(slice []interface{}, i int) []interface{} { // copy(slice[i:], slice[i+ ...

  10. 用户登录注册(安全)(常规、FB、google、paypal) 实战

    /* 用户登录界面 */elseif ($action == 'login'){    if($_SESSION['user_id'])    {        ecs_header("Lo ...