• C#调用C++ 的DLL传送和接收中文字符串


    1 c#向c++传送中文字符串

    设置:将 字符集 改为 使用多字节字符集
    在这里插入图片描述

    cpp代码:

    extern "C"_declspec(dllexport) int input_chn_str(char in_str[])
    {
    	cout<<in_str<<endl;
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    c#代码:

    [DllImport("Demo.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]
    public static extern bool input_chn_str(byte[] in_str);
    
    string str = "中国chn123"; 
    int rst = input_chn_str(Encoding.Default.GetBytes(str));
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2 C#接收c++返回的中文字符串

    cpp代码:

    extern "C"_declspec(dllexport) int ProcessChineseString(const char* input, char* output)
    {
    	std::string inputString(input);
    	std::string outputString = "输入内容为:" + inputString;
    	strcpy(output, outputString.c_str());
    
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    c#代码:

    [DllImport("ocr_cpu.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)]
    extern static int ProcessChineseString(IntPtr input1, IntPtr output1);
    
    string chineseInput = "你好123abc不不不";
    byte[] inputBytes = Encoding.Default.GetBytes(chineseInput);
    IntPtr inputPtr = Marshal.AllocHGlobal(inputBytes.Length + 1);
    Marshal.Copy(inputBytes, 0, inputPtr, inputBytes.Length);
    Marshal.WriteByte(inputPtr, inputBytes.Length, 0); // 添加字符串结束符
    
    IntPtr outputPtr = Marshal.AllocHGlobal(1000);
    ProcessChineseString(inputPtr, outputPtr);
    string outputString = Marshal.PtrToStringAnsi(outputPtr);
    
    Console.WriteLine(outputString);
    
    Marshal.FreeHGlobal(inputPtr);
    Marshal.FreeHGlobal(outputPtr);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    如果遇到乱码:

    [DllImport("ocr_cpu.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)]
            extern static int infer(IntPtr output);
    
    
    IntPtr outputPtr = Marshal.AllocHGlobal(1000);
    
    rst = infer(outputPtr);
    
     {
         int length = 0;//循环查找字符串的长度 
    
         while (Marshal.ReadByte(outputPtr + length) != 0)
         {
             length++;
         }
    
         byte[] strbuf = new byte[length];
         Marshal.Copy(outputPtr, strbuf, 0, length);
    
         // Taken from https://msdn.microsoft.com/it-it/library/system.text.encodinginfo.getencoding(v=vs.110).aspx 
         string message1 = Encoding.UTF8.GetString(strbuf);
         Console.WriteLine(message1);
     }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
  • 相关阅读:
    k8s、数据存储
    K8s安装乐维5.0应用部署文档
    详解uniapp和vue在路由方面的不同和联系
    战略合作|SubQuery 成为章鱼网络浏览器的秘密武器
    HJ57 高精度整数加法
    Springboot整合SpringCache+redis简化缓存开发
    非自交任意多边形与矩形框的交集面积计算方法
    Nginx配置中root和alias分不清?本文3分钟帮你解惑!
    Qt的对象树
    Arduino + ESP32-C3 + TFT(1.8‘ ST7735S)基础平台(实验七)温湿度动态图表显示的网页服务器
  • 原文地址:https://blog.csdn.net/shanglianlm/article/details/133983154