C#調用C++動態庫如何接收C++數據類型為char*


1、托管類型和非托管類型區別
托管: 指內存管理由系統而不是程序員管理,.net,C#等(自動垃圾回收機制)
非托管:內存由程序員手動釋放,C++
嚴格意義來說,沒有非托管C++,托管只是一種對C++的擴展,如C++/CLI,使用別的辦法也可由系統管理內存。
托管代碼:由CLR(公共語言運行庫)執行的代碼,CLR服務如:自動垃圾回收、運行庫類型檢測、安全支持等。
非托管代碼:由操作系統直接執行的代碼,必須提供自己的垃圾回收、類型檢查、安全支持等。

2、C#調用C++動態庫如何接收C++數據類型為char*
1)C++動態庫方法(此處舉例兩種函數返回值:int 和char*):
cpp文件中:

extern "c" int funcName(char* str, int nLength,char* bt)
{
  char m_buff[100];
  ........  //數組操作
  memcpy(bt,m_buff,len);  //len為m_buff數組的有效長度(可根據需求自己取長度),將數組m_buff賦給bt
  return len;
}

頭文件中:

define DLL_API __declspec(dllexport)

extern “C” DLL_API int funcName(char* str,int nLength, char* bt);

2)C#中調用C++動態庫(對應C++動態庫函數返回值int和IntPtr):

a.動態庫方法入口(示例)

[DllImport("DLLTest.dll",EntryPoint="funcName",CallingConvention=CallingConvention.Cdecl,Charset=Charset.Ansi)
public static extern int funcName(byte[] strint nLength,,ref byte bt);

b.調用該方法(傳參示例)

byte[] b = new byte[256];
int receivelen = DLLTest.funcName(msg,m_nLength,ref b[0]); //傳入數組b引用地址,使其指向C++動態庫中賦值數組

此時數組b即為調用C++動態庫得到的數組值 

 

本文轉載自:https://blog.csdn.net/qq_22889875/article/details/78624847


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM