C#调用C++ dll,C++返回类型为char*,并通过指针传出值
编写生成c++ dll
- 在项目属性页修改项目类型为动态库(.dll)
- 编写头文件,声明要导出的函数
编写一个动态链接库,需要在一个头文件.h中声明你要导出的函数,并在对应的.cpp中实现需要导出的函数。同时也需要定义导出符号,注意导出符号的前缀应保持与项目名一致:
在.cpp文件中,include编写好的对应头文件:
- 生成解决方案,在工程目录下找到生成的dll,具体位置可以通过
属性页->链接器->常规->输出文件
查看:
Unity C#中调用C++ dll
- 将生成的.dll文件,放在Unity工程的Assets/Plugins文件夹下:
- 在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乱码)