DLL入门:C#调用C++ DLL例子

本文简单介绍了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

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页