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#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

原创粉丝点击