DLL入门:C#调用C++ DLL例子
来源:互联网 发布:新网域名转万网 编辑:程序博客网 时间:2024/06/05 22:31
本文简单介绍了C#调用C++编写的DLL文件的例子,以及C++回调C#函数时的一些坑
IDE采用VS2017;
新建C++的DLL项目:新建项目-->C++-->Windows桌面向导;新建类:dll_test.cpp、dll_test.h。
dll_test.h
#ifndef _DLLTUT_DLL_H_#define _DLLTUT_DLL_H_#define DLL_EXPORT#if defined DLL_EXPORT#define DECLDIR __declspec(dllexport)#else#define DECLDIR __declspec(dllimport)#endifextern "C"{//pointer callback must _stdcall;DECLDIR void CallbackTest(int i, void(*call_back)(int a));DECLDIR int SUM_ADD(int a, int b);}// End the inclusion guard#endifdll_test.cpp
#include "dll_test.h"void CallbackTest(int i, void (*call_back)(int a)){int aa;aa = i*i;call_back(aa);}int SUM_ADD(int a, int b){return a+b;}坑:因为C#没有指针的概念,当传入Callback后,C++中当做回调指针处理,处理完了就GC掉,然后在C#中会出现莫名的退出,没有任何错误提示。
解决方法:需要在指针前加上__stdcall:DECLDIR void CallbackTest(int i, void(__stdcall*call_back)(int a))。
项目生成DLL文件;将该DLL文件拷贝到C#项目的DEBUG目录下;
C#中调用:
[DllImport("DllTest.dll", CharSet = CharSet.Auto, EntryPoint = "CallbackTest", CallingConvention = CallingConvention.Cdecl)] private static extern void Test(int a, CSCallback callback); public delegate void CSCallback(IntPtr num); CSCallback callback; static void CSCallbackFunction(IntPtr num) { Debug.WriteLine("dll call: " + num); } public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { int i = SDK.SUM_ADD(1, 2); textBox1.Text = i.ToString(); callback = new CSCallback(CSCallbackFunction); Test(2, callback); }
例程下载:http://download.csdn.net/download/weixin_39501970/9990668
阅读全文
0 0
- DLL入门:C#调用C++ DLL例子
- C#调用C++DLL例子
- C#调用C++DLL
- C#调用C++dll
- C#调用C++dll
- C#调用C++DLL
- c#调用c++DLL
- C# 调用C++dll
- C#调用C++DLL
- C#调用C++DLL
- C#调用C++DLL
- C#调用C++Dll
- C#调用C++DLL
- C#下调用C写的dll的例子
- C入门:C调用DLL
- C#调用C、C++dll
- C#调用DLL入门方法
- C#调用C的DLL
- VS+CMake+opencv3+opencv_contrib
- 解读tensorflow之rnn
- 1013. Battle Over Cities (25)
- java 的 && 和 & 、|| 和 | 区别
- gradle扩展属性、任务与构建周期
- DLL入门:C#调用C++ DLL例子
- MyBatis 动态SQL
- centos7环境下编译bitcoin
- find your present (2)
- MapReduce实战练习四:找出共同好友
- 电磁兼容设计中,有关旁路电容和耦合电容学习 从电路来说,总是存在驱动的源和被驱动的负载。如果负载电容比较大,驱动电路要把电容充电、放电,才能完成信号的跳变,在上升沿比较陡峭的时候,电流比较大,这样驱动
- win10多屏显示时分别设置壁纸
- centos7 安装rocketmq
- 机器学习第十六课part2(前向算法,后向算法)