c# 调用 c++ builder c语言 dll,C# 调用C++ dll 返回char*调用方式(StringBuilder乱码)

usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Runtime.InteropServices;usingSystem.Text;usingSystem.Threading.Tasks;namespaceDotNet_Use_C_Demo

{public classTestCMethodHelper

{

[DllImport("CDLLDemo.dll", CallingConvention = CallingConvention.Cdecl, CharSet =CharSet.Auto)]private static extern int ParseBaliseMsg2(string msg, string rmsg, ref bytememory);

[DllImport("CDLLDemo.dll", CallingConvention = CallingConvention.Cdecl, CharSet =CharSet.Auto)]private static extern IntPtr ParseBaliseMsg3(string msg, string rmsg, ref intrInt);

[DllImport("CDLLDemo.dll", CallingConvention = CallingConvention.Cdecl, CharSet =CharSet.Auto)]private static extern IntPtr ParseBaliseMsg4(string msg, stringrmsg, [MarshalAs(UnmanagedType.LPStr)]StringBuilder t);

[DllImport("CDLLDemo.dll", CallingConvention = CallingConvention.Cdecl, CharSet =CharSet.Auto)]private static extern IntPtr ParseBaliseMsg5([MarshalAs(UnmanagedType.LPStr)]StringBuilder msg, stringrmsg, [MarshalAs(UnmanagedType.LPStr)]StringBuilder t);

[DllImport("CDLLDemo.dll", EntryPoint = "strcpyTest", CallingConvention = CallingConvention.Cdecl/*, CallingConvention = CallingConvention.Cdecl*/)]public static extern IntPtr strcpyTest(ref byte destA, stringsourA);public static voidTestMethod()

{

Byte[] bPara= new Byte[100]; //新建字节数组

var r2 = ParseBaliseMsg2("abcd", "", ref bPara[0]);string strGet = System.Text.Encoding.Default.GetString(bPara, 0, bPara.Length); //将字节数组转换为字符串

Console.WriteLine("返回值:" +r2);

Console.WriteLine("传出值:" +strGet);

Console.WriteLine("***************************************************");int retResult = 0;

IntPtr pRet= ParseBaliseMsg3("1234", "", refretResult);string strRet =Marshal.PtrToStringAnsi(pRet);

Console.WriteLine("返回值:" +strRet);

Console.WriteLine("传出值:" +retResult);

Console.WriteLine("***************************************************");//StringBuilder方式

StringBuilder sb = newStringBuilder();var r4 = ParseBaliseMsg4("abcd", "", sb);

Console.WriteLine("返回值:" +r4);

Console.WriteLine("传出值:" +sb.ToString());

Console.WriteLine("***************************************************");

StringBuilder sb5= newStringBuilder();

StringBuilder sb5E_para= newStringBuilder();

sb5E_para.Append("abcdedf123456");var r5 = ParseBaliseMsg5(sb5E_para, "", sb5);

Console.WriteLine("返回值:" +r5);

Console.WriteLine("传出值:" +sb5.ToString());

}public static voidCpyTest()

{string strSour = "测试调用C++ dll";

Byte[] bPara= new Byte[100]; //新建字节数组

IntPtr pRet= strcpyTest(ref bPara[0], strSour);string strGet = System.Text.Encoding.Default.GetString(bPara, 0, bPara.Length); //将字节数组转换为字符串

string strRet =Marshal.PtrToStringAnsi(pRet);

Console.WriteLine("源字符串:");

Console.WriteLine(strSour);

Console.WriteLine("传出值:");

Console.WriteLine(strGet);

Console.WriteLine("返回值:");

Console.WriteLine(strRet);

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值