本文简单介绍了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)
#endif
extern "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
#endif
dll_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