C#接收C++动态库返回字符串char*,在C#端如何接收并得到正确的字符串

最近调用动态库传数据,发现C#接收C++动态库返回字符串char*,在C#端设置对应类型为string无法接收到正确值,最后想到在C#端先用字节数组接收返回的字符串,然后再将字节数组转换为对应的字符串,数据接收终于正确
首先打开VS2012,新建项目->Visual C++,选择Win32项目,如图选择dll
C#接收C++动态库返回字符串char*,在C#端如何接收并得到正确的字符串_第1张图片
新建项目的名字为dlltest,新建头文件dlltest.h,在源文件dlltest.cpp中加入如下代码:

#include "stdafx.h"
#include "dlltest.h"
char s[20]="您好hahaha";
int __stdcall test(char* str)
{
    char attr[1024];
    memset(attr,0,sizeof(attr));
    memcpy(attr,s,sizeof(s));
    memcpy(str,attr,sizeof(attr));
    return 1;
}

在dlltest.h中加入:

extern "C" _declspec(dllexport) int __stdcall test(char* str);

运行环境为debug模式,点击生成解决方案,在debug文件下可看到生成了dlltest.dll,这就是动态库文件。
C#接收C++动态库返回字符串char*,在C#端如何接收并得到正确的字符串_第2张图片

打开VS2012,新建Visual C#控制台应用程序,命名为dlltestC
新建类文件Class1.cs,启动程序,运行空项目(debug模式),生成exe文件,打开exe所在目录,将之前生成的dll复制到该目录下,如图。
C#接收C++动态库返回字符串char*,在C#端如何接收并得到正确的字符串_第3张图片
然后在Class1.cs中加入如下代码:

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

namespace dlltestC
{
    public class Class1
    {
        [DllImport("dlltest.dll", EntryPoint = "test")]
        public extern static int test(ref byte str);

    }
}

最后在Program.cs中加入:

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

namespace dlltestC
{
    public class Program
    {
        static void Main(string[] args)
        {
            byte[] s = new byte[1024];
            int t = Class1.test(ref s[0]);//用字节数组接收动态库传过来的字符串
            string strGet = System.Text.Encoding.Default.GetString(s, 0, s.Length); //将字节数组转换为字符串
            Console.WriteLine(strGet);

        }
    }
}

运行该程序,输出:您好hahaha

你可能感兴趣的:(C#,c++)