託管c 與c 的轉換一

2021-09-19 08:36:35 字數 1684 閱讀 4539

一、c++中的const char*,std:string,與託管c++string^的相互轉換

你希望c#中呼叫某個原 c++函式:readallquertdata(const char* pbatchname)。由於c#中沒有char*型別,我們使用託管c++來進行一層封裝,託管c++可以直接呼叫原生c++的**,下面是託管c++中乙個函式,引用命名空間:

#include

#include

using namespace system;

using namespace system::runtime::interopservices;

using namespace msclr::interop;

對原生的c++函式進行包裝:

readallquertdata_clr(string^ pbatchname)

char* temp=(char*)(void*)marshal::stringtohglobalansi(pbatchname);

readallquertdata(temp);     //原生的c++函式 

重新編譯下,c#就完成呼叫c++的readallquertdata函式

char*  轉換為 string^:     (char*)(void*)marshal::stringtohglobalansi(pbatchname);

std:string 轉為string^  :   marshal_as(str_batchnumber.c_str());

string^ name=gcnew string(tempstrname.c_str());

string^轉為std:string   :  

marshal_as(info->str_hostid->tostring())   或者

(char*)(void*)marshal::stringtohglobalansi(pbatchname);//char*隱式轉為string

(const char*)(marshal::stringtohglobalansi(datain[j]->paramname)).topointer();

二、對於int&,unsigned long long&,int*,float*等值型別的引用變數,可以使用%來包裝,例如:原生c++ 中有

bool getouttotalcount(unsigned long long& ncount);

在託管c++中,可以寫成

bool getouttotalcount_clr(unsigned long long% ncount)

unsigned long long temp = 0;

ncount = temp;

getouttotalcount( ncount);

對於原生c++的getdata(unsigned long long* ncount)

託管c++中,這樣寫

getdata_clr(unsigned long long% ncount)

unsigned long long temp = 0;

ncount = temp;

getdata( &ncount);

編譯生成後c#中, getouttotalcount_clr(ref unsigned long long ncount);

getdata_clr(ref  unsigned long long ncount)

託管c 與c 的呼叫

專案中,需要c 實現與硬體的通訊,顯示使用c 進行。查詢了相關資料,可以使用託管c 建立c 與c 之間的聯絡。基本框架如下 託管c 專案的建立請參考 注意,如果直接建立c 的dll庫,要注釋掉dllmain.cpp檔案,不然會報錯,或者建立mfc的dll。我除錯了好久,血的教訓!它介紹了建立託管c ...

C 託管記憶體與非託管記憶體之間的轉換

c 有自己的記憶體 機制,所以在c 中我們可以只new,不用關心怎樣delete,c 使用gc來清理記憶體,這部分記憶體就是managed memory,大部分時候我們工作於c 環境中,都是在使用託管記憶體,然而c 畢竟執行在c 之上,有的時候,比如可能我們需要引入一些第三方的c 或native 的...

轉 C 託管記憶體與非託管記憶體之間的轉換

1.c 的託管 和非託管 c 有自己的記憶體 機制,所以在c 中我們可以只new,不用關心怎樣delete,c 使用gc來清理記憶體,這部分記憶體就是managed memory,大部分時候我們工作於c 環境中,都是在使用託管記憶體,然而c 畢竟執行在c 之上,有的時候,比如可能我們需要引入一些第三...