C#调用C++动态库,参数包含string/wstring,如何处理?

在C++中写了一个简单的函数如下:
头文件:

void __declspec(dllexport) GetUnicodeString(wstring& str);

实现文件:

void GetUnicodeString(wstring& str)
{
 str = L"This is a String in C++ Dll";
}

在C#中,通过Dllimport的方式引入:

[DllImport(@"Test.dll",               
 EntryPoint = "XXXXX",
             CallingConvention = CallingConvention.Cdecl, 
 CharSet = CharSet.Unicode)] 
 public static extern void GetUnicodeString(ref string str);
 static void Main(string[] args)
{
    string str = "This is a String in C# .....";
    GetUnicodeString(ref str);
    Console.Read();
}

遗憾的是在调用GetUnicodeString(ref str);的时候崩溃了,按理说C#和C++是两个语言,这样用string传入风险值很大,但是竟然有个同事一直这样用了很久。。。难以理解。
要想C#调用C++的函数,只能用原生态的参数(char*,wchar_t*),故把C++的函数改为:

void GetUnicodeString(wchar_t* wstr, int len)
{
	wcscpy_s(wstr, len, L"This is a String in C++ Dll");
}

然后C#在使用时,以Byte申请空间传入,最后转为Unicode字符串

public static extern void GetUnicodeString(ref Byte str, int len);
static void Main(string[] args)
{
	Byte[] buffer = new Byte[257 * 2];
	GetUnicodeString(ref buffer[0], 256);
	string str = UnicodeEncoding.Unicode.GetString(buffer);
	Console.WriteLine(str);
	Console.Read();
}

终于,得到了返回的字符串值This is a String in C++ Dll

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wayright

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值