一、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 之上,有的時候,比如可能我們需要引入一些第三...