C#调用C++ dll,C++返回类型为char*,并通过指针传出值

30 篇文章 5 订阅
17 篇文章 1 订阅

编写生成c++ dll

  1. 在项目属性页修改项目类型为动态库(.dll)
    在这里插入图片描述
  2. 编写头文件,声明要导出的函数
    编写一个动态链接库,需要在一个头文件.h中声明你要导出的函数,并在对应的.cpp中实现需要导出的函数。同时也需要定义导出符号,注意导出符号的前缀应保持与项目名一致:
    在这里插入图片描述
    在.cpp文件中,include编写好的对应头文件:
    在这里插入图片描述
  3. 生成解决方案,在工程目录下找到生成的dll,具体位置可以通过属性页->链接器->常规->输出文件查看:在这里插入图片描述

Unity C#中调用C++ dll

  1. 将生成的.dll文件,放在Unity工程的Assets/Plugins文件夹下:
    在这里插入图片描述
  2. 在C#脚本中导入需要调用的dll接口函数,如下图:
    在这里插入图片描述
    通过以上两步就可以在此脚本中调用这些函数了。

C#调用C++ dll,返回值为char*,并通过指针修改传出值

编写C++程序,生成dll库:

// CDLLDemo.cpp : 定义 DLL 应用程序的导出函数。
//
#include "stdafx.h"
#include "string.h"
#include <stdio.h>
#include <time.h>
char * ParseBaliseMsg(const unsigned char *pMsgData, char *resTgm, int & retInt)
{
    printf("%s \r\n", pMsgData);
    char *resStr = "ParseBaliseMsg hello word!";
    printf("resStr is: %s \r\n", resStr);

    time_t rawtime;
    struct tm * timeinfo;
    time(&rawtime);
    timeinfo = localtime(&rawtime);
    printf("The current date/time is: %s \r\n", asctime(timeinfo));
    retInt = 130;
    return resStr;
}

C#中调用C++ dll:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;

namespace DotNet_Use_C_Demo
{
    public class TestCMethodHelper
    {
        [DllImport("CDLLDemo.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Auto)]
        private static extern IntPtr ParseBaliseMsg3(string msg, string rmsg, ref int rInt);
    }
    public static void TestMethod()
    {
		int retResult = 0;
        IntPtr pRet = ParseBaliseMsg3("1234", "", ref retResult);
        string strRet = Marshal.PtrToStringAnsi(pRet);
        Console.WriteLine("返回值:" + strRet);
        Console.WriteLine("传出值:" + retResult);
        Console.WriteLine("***************************************************");
    }
}

运行输出如下:

resStr is: ParseBaliseMsg hello word!
The current date/time is: Tue Nov 13 10:29:30 2020

返回值: ParseBaliseMsg hello word!
传出值: 130
***************************************************

:如果想将返回的IntPtr存入byte[]中,可以通过Marshal.Copy的方法:
在这里插入图片描述

参考资料

C++编写dll:
Walkthrough: Create and use your own Dynamic Link Library (C++)
C++在VS下创建、调用dll
(windows平台下)深入详解C++创建动态链接库DLL以及如何使用它(一)
C#调用C++ dll:
C++DLL与Unity交互的技术总结
C#与C++数据类型对应关系
C# 调用C++ dll 返回char*调用方式(StringBuilder乱码)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值