zoukankan      html  css  js  c++  java
  • C# 接收C++ dll 可变长字节或者 字符指针 char*

         网络上查找到的几乎都是 需要提前固定知道 接收字符(字节)数据的大小的方式,现在的数据大小方式 不需要提前知道如下

    思路:

    1 .C++,返回变长 指针或者字节 的地址给C# 接收,同时返回 该地址的数据长度给C#。

     2 .C# 通过C++ 返回的数据长度,创建接收数据的byte[] 长度。

     3.C# 通过返回的地址 拷贝读取数据。

    C++  代码如下: 

     

    extern "C"      __declspec(dllexport)   char  *  GetFileByteArray(wchar_t * BinfilePath, wchar_t *BinfileName,int indexFile, int * length)
     {
    
           
         char *chBinfilePath= nullptr, *chBinfileName = nullptr;
         wchar_tTranstoChar(BinfilePath, &chBinfilePath);
         wchar_tTranstoChar(BinfileName, &chBinfileName);
    
         char a[] = "13345zh中文 hello";
            //前提条件需要 返回变长的指针
         int  fileCount = sizeof(a);
            
         char  *att = new char[fileCount];
         memcpy(att, a, fileCount);
    
         *length = fileCount-1; // C#获得长度 
    
         free(chBinfilePath);
         free(chBinfileName);
        
         return  att;// C# 获得指针
        
     }

    C# 处理如下: 

            [DllImport("BASECORELIBRARY.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)]
            public static extern IntPtr GetFileByteArray(string BinfilePath, string BinfileName, int indexFile,ref  int length);
    
    
    
    
     int length = 0;
              
                IntPtr piBuf = InvokeDLL.GetFileByteArray(newFilePath, toBinName, 0, ref length);
                
                byte[] arrayBuf = new byte[length];
                Marshal.Copy(piBuf,arrayBuf,0, length);
    
                string st=  Encoding.Default.GetString(arrayBuf);
                Console.WriteLine(st);

    输出结果: 13345zh中文 hello            

  • 相关阅读:
    数据库性能测试---前阿里数据库团队资深DBA杨奇龙
    阿里云 MYSQL 与 PG(丁奇与德哥)
    RHEL6中ulimit的nproc限制
    Linux下文件描述符
    Linux中的文件描述符与打开文件之间的关系------------每天进步一点点系列
    5.6 太多分区引起OOM
    Linux lsof命令使用小结
    重现PHP Core的调用栈
    用GDB排查Python程序故障
    mysql 索引优化
  • 原文地址:https://www.cnblogs.com/bkyrslf/p/12077637.html
Copyright © 2011-2022 走看看