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 = 111;
    return *a + *b;
}
TESTCPPDLL_API char __stdcall QQ(unsigned char* userContent)
{
    return userContent[0];
}

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 = 222;
            int b;
            int ans = Add(out a, out b);

            byte[] bb = new byte[10];
            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*来接收。

时间: 2024-10-08 07:37:15

C#调用C++函数的相关文章

C#实现百度地图附近搜索&amp;调用JavaScript函数

前一篇文章"C#调用百度地图API入门&解决BMap未定义问题"讲述了如何通过C#调用百度API显示地图,并且如何解决BMap未定义的问题.这篇文章主要更加详细的介绍百度地图的一些功能,包括附近搜索.城市搜索.路线规划.添加覆盖物等等. 希望文章对你有所帮助!如果文章中有不足之处,还请海涵~ 百度官方文档:http://developer.baidu.com/map/jsmobile.htm 官方DEMO例:http://developer.baidu.com/map/jsde

RTX——第19章 SVC 中断方式调用用户函数(后期补历程)

本章节为大家讲解如何采用 SVC 中断方式调用用户函数. 当用户将 RTX 任务设置为工作在非特权级模式时,任务中是不允许访问特权级寄存器的,这个时候使用 SVC 中断,此问题就迎刃而解了. SVC 功能介绍SVC 用于产生系统函数的调用请求.例如,操作系统通常不让用户程序直接访问硬件,而是通过提供一些系统服务函数,让用户程序使用 SVC 发出对系统服务函数的呼叫请求,以这种方法调用它们来间接访问硬件.因此,当用户程序想要控制特定的硬件时,它就要产生一个 SVC 异常,然后操作系统提供的SVC

QT5.3无法自动调用incomingConnection函数的问题(4.7没有这个问题)

最近将qt4.7的一个工程移到5.3,遇到了几个麻烦事,主要是这个incomingConnection监听后无法自动调用的问题,在4.7上是完全没有问题的,到了5.3就不行,网上也查了下,网友们都是放出问题,然而都没有写出解决. 1.一步解决 我之前是这样写的: void TFTPxServer::incomingConnection(int socketDescriptor) { qDebug() << "incomingConnection..."; TFTPxThre

用户选择,调用相应函数的编写方法

用户选择,调用相应函数的编写方法: 1.先输出Menu菜单,让用户选择. 2.创建一个Menu字典k=序号,v=操作函数 3.调用用户选择的相应序号的函数:menu[option](参数) def account_info(acc_data): print(user_data) def repay(acc_data): pass def withdraw(acc_data): pass def transfer(acc_data): pass def pay_check(acc_data): p

第 13 条:使用立即调用的函数表达式创建局部作用域

第 13 条:使用立即调用的函数表达式创建局部作用域这段程序(Bug 程序)输出什么? function wrapElements(a) { var result = [], i, n; for (i = 0, n = a.length; i < n; i++) { result[i] = function() { return a[i]; }; } return result; } var wrapped = wrapElements([10, 20, 30, 40, 50]); var f

C++面试题1:构造函数和虚构函数中能否调用虚函数?

C++面试题1:构造函数和虚构函数中能否调用虚函数? 构造函数跟虚构函数里面都可以调用虚函数,编译器不会报错. C++ primer中说到最好别用 由于类的构造次序是由基类到派生类,所以在构造函数中调用虚函数,虚函数是不会呈现出多态的 类的析构是从派生类到基类,当调用继承层次中某一层次的类的析构函数时意味着其派生类部分已经析构掉,所以也不会呈现多态 因此如果在基类中声明的纯虚函数并且在基类的析构函数中调用之,编译器会发生错误. class Base { public: Base() { Fuct

C++中构造函数能调用虚函数吗?(答案是语法可以,输出错误),但Java里居然可以

环境:XPSP3 VS2005 今天黑总给应聘者出了一个在C++的构造函数中调用虚函数的问题,具体的题目要比标题复杂,大体情况可以看如下的代码: [cpp] view plain copy class Base { public: Base() { Fuction(); } virtual void Fuction() { cout << "Base::Fuction" << endl; } }; class A : public Base { public:

Effective C++ Item 09-绝不在构造函数和析构函数中调用virtual函数

Item 09-绝不在构造函数和析构函数中调用virtual函数(Never call virtual functions during construction or destruction) Why? 由于base class构造函数的执行更早于derived class构造函数,当base class构造函数执行derived class的成员变量尚未初始化.如果期间调用的virtual函数下降至derived class阶层,要知道derived class的函数几乎必然取用local成

如何让静态库中的可执行程序不调用的函数不链接进该可执行程序?(-ffunction-sections -Wl,--gc-sections)

如何让静态库中的可执行程序不调用的函数不链接进该可执行程序?(-ffunction-sections -Wl,--gc-sections) 关键词: -Wl,--gc-sections   -ffunction-sections  链接  elf   库 有时我们会遇到这种情况,可执行程序需要链接一些静态库,但是静态库中的函数并没有全部使用,只用了其中的几个,但是系统默认会自动把整个静态库全部链接到可执行程序中,造成可执行程序的大小大大增加,浪费了flash空间和内存空间.gcc为我们提供的解决

[转] matlab调用opencv函数的配置

原文地址百度账户 aleasa123 1.  首先保证vs2010能正确调用opencv函数, 2.  Matlab中选择编译器,操作如下: 打开matlab2012,输入mex –setup,出现如下提示: Welcome to mex -setup. This utility will help you set up a default compiler. For a list of supported compilers, see http://www.mathworks.com/supp