page contents

C#调用C++动态库接口函数和回调函数方法

本文讲述了C#调用C++动态库接口函数和回调函数方法!具有很好的参考价值,希望对大家有所帮助。一起跟随六星小编过来看看吧,具体如下:

attachments-2022-05-oCPYHt6762872c87c2d37.png本文讲述了C#调用C++动态库接口函数和回调函数方法!具有很好的参考价值,希望对大家有所帮助。一起跟随六星小编过来看看吧,具体如下:

需求: 当前C已经写好了一个动态库,完成了产品开发需求,C#需要调用C编写的动态库DLL接口,开发出完整的软件,DLL动态库里包含了普通接口函数,回调函数。

开发环境: win10 64位 、VS2017

2. 普通接口函数调用示例
2.1 C++端编写接口

(1)头文件里声明需要提供的接口,导出接口,方便C#调用

1
2
3
4
//带返回值无形参示例
EXTERN_C TOOLLIBRARY_API char* Version(void);
//无返回值带指针形参示例
EXTERN_C TOOLLIBRARY_API void SetApplicationDirPath(char *buff);

(2)源代码

1
2
3
4
5
6
7
8
9
10
11
char* Version(void)
{
    return version_str;
}
 
void SetApplicationDirPath(char * buff)
{
    std::string str = buff;
    printf("传入的参数:%s\n", buff);
    std::cout << "字符串:"<<buff <<std::endl;
}

这里写了两个函数,分别演示传参和带返回值的接口函数使用方法。

2.2 C#端调用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
namespace CSharp_LoadLibrary
{
    class Program
    {
        [DllImport("TOOLLIBRARY.dll", EntryPoint = "Version", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
        extern static IntPtr Version();
 
        [DllImport("TOOLLIBRARY.dll", EntryPoint = "SetApplicationDirPath", CallingConvention = CallingConvention.Cdecl)]
        extern static void SetApplicationDirPath(IntPtr text);
         
        static void Main(string[] args)
        {
            //传入参数--测试
            SetApplicationDirPath(Marshal.StringToHGlobalAnsi("传入字符串测试.."));
 
            //打印返回值测试
            Console.WriteLine(Marshal.PtrToStringAnsi(Version()));
        }
    }
}

3. 回调函数调用示例

回调函数,光听名字就比普通函数要高大上一些,那到底什么是回调函数呢?下面来至百度百科的解释:

回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

回调函数是指 使用者自己定义一个函数,实现这个函数的程序内容,然后把这个函数(入口地址)作为参数传入别人(或系统)的函数中,由别人(或系统)的函数在运行时来调用的函数。函数是你实现的,但由别人(或系统)的函数在运行时通过参数传递的方式调用,这就是所谓的回调函数。简单来说,就是由别人的函数运行期间来回调你实现的函数。

3.1 C++端编写接口

(1)头文件声明

1
2
//设置回调函数指针
EXTERN_C TOOLLIBRARY_API void Set_DebugCallBackFunction(void(*func)(const char *p));

(2)源代码

1
2
3
4
5
6
7
8
//C++的回调函数
void Set_DebugCallBackFunction(void(*func)(const char *p))
{
    //设置回调函数指针
    CallBackFunction_p = func;
    printf("回调函数设置成功.\n");
    CallBackFunction_p("这是回调函数传出来的测试数据.\n");
}

这是C端编写的一个回调函数设置函数,C#调用这个函数将函数指针传递过来,C通过传递过来的函数指针反过来主动调用C#的方法,实现数据交互。

3.2 C#端调用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;
 
namespace CSharp_LoadLibrary
{
    class Program
    {
        [DllImport("TOOLLIBRARY.dll", EntryPoint = "Set_DebugCallBackFunction", CallingConvention = CallingConvention.Cdecl)]
        extern static int Set_DebugCallBackFunction(CallbackDelegate callback);
         
        //定义委托
        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
        public delegate void CallbackDelegate(IntPtr Path);
 
        //接收C++回调数据
        //当C++调用传递过去的函数指针时,就会执行下面这个方法
        static void CallBackFunction(IntPtr Path)
        {
            Console.WriteLine("C++传出来的回调:" + Marshal.PtrToStringAnsi(Path));
        }
 
        static void Main(string[] args)
        {
            //调用C++设置回调函数的接口,将C#的函数地址传递过去
            Set_DebugCallBackFunction(CallBackFunction);
        }
    }
}

到此这篇关于C#调用C++动态库接口函数和回调函数方法的文章就介绍到这了。

更多相关技术内容咨询欢迎前往并持续关注六星社区了解详情。

如果你想用Python开辟副业赚钱,但不熟悉爬虫与反爬虫技术,没有接单途径,也缺乏兼职经验
关注下方微信公众号:Python编程学习圈,获取价值999元全套Python入门到进阶的学习资料以及教程,还有Python技术交流群一起交流学习哦。

attachments-2022-06-pOpIuwuO62b4222cdaa73.jpeg

  • 发表于 2022-05-20 13:52
  • 阅读 ( 328 )
  • 分类:C/C++开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
轩辕小不懂
轩辕小不懂

2403 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1312 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章