標籤:c# vc++ 控制台 clr
C#簡單易操作,而且有比較豐富的類庫, 方便處理各種情況,比如來說處理字串,我覺得用C#就比較的方便,或者是用java之類的,用C++處理起來感覺比較繁瑣,所以在用VC進行編程的時候放著C#不用感覺蠻可惜,好了,廢話不多說,進入正題!
開發環境:VS2005,VC++
項目:VC++ MFC
1,使用的環境條件
建立一個VC++的項目:
首先環境配置,右鍵項目-->屬性-->配置屬性-->常規-->找到右邊的:
字元集,將其設定為:使用多位元組字元集
公用語言運行庫支援,將其設定為:公用語言運行庫支援(/clr)
2,命名空間的引用
在需要使用C#的檔案中進行引用C#的命名空間
比如引用C#的System這個類庫:
using namespace System;
但是如果是想要引用自己寫的類庫怎麼辦呢?
還有一個方法可以實現這類的調用,首先將C#產生一個dll
然後在VC++中如下引用這個dll
#using "../xx/mydll.dll"
引用完dll就如上面引用系統庫來對自己的庫進行引用了
using namespace mydll;
總結注意:
VC++的引用只支援到一級包的引用,對於二級以上的不能採用類似如下的方法進行引用
比如需要一用System.Data錯誤引用方法:using namespace system.Data; 這是絕對錯誤的,編譯會產生如下錯誤:
.\TestMFCCSDlg.cpp(8) : error C2143: 語法錯誤: 缺少“;”(在“.”的前面)
所以切記!
之後叫你怎麼引用二級包以上裡面類的方法!
3,調用C#的方法
在進行引用後那就是C#支援庫的類和類的方法的調用了!
1)簡單的C#列印語句調用
例如:用C#在控制台列印出”Hello World!”
Console::WriteLine("Hello "+" World!");
結果
從這裡我們可以看到這個文法與C#的有稍微的不同,這裡是採用C++的調用方式來進行C#方法的調用
這裡是採用“::”而不是“.”來進行方法的調用!
還有需要注意的是“::”是調用C#的靜態方法(類方法),對於C#非靜態方法(對象方法)的調用之後會說明!
2)建立C#對象
例如:建立一個C#的String對象, 並在控制台列印出這個對象:
String^ str = gcnew String("String");Console::WriteLine(str);
結果
從這裡我們也可以在VC++中建立C#對象與在C#環境下的不同,
首先,對象的聲明得多加一個“^”符號,其次這裡是用“gcnew”來建立對象而不是“new”
3)調用C#對象的方法(非靜態方法)
例如:調用String的Equals方法,並將比較結果列印出來:
String^ str = gcnew String("String");bool b = str->Equals("String");Console::WriteLine("str = " + str+ "--------->str.equals('String')?:" + b);
結果
從這裡我們可以看出,調用C#對象的方法是採用類似C語言的引用方式,用“->”來進行對象方法的調用;
4)對於C#二級包及以上的庫的調用
例如:建立System.Text包下的StringBuilder對象,並將其列印出來:
Text::StringBuilder^ sb = gcnew Text::StringBuilder("StringBuilder");Console::WriteLine("sb = " + sb);
結果
從這裡我們可以看出,在引用一級包後,對於二級包的對象建立需要用到:(二級包名::對象名)來進行對象的引用,對於二級以上的可以這樣建立:(二級包名::三級包名::對象名)來進行對象的引用,之後的依此類推!
5)將C#的String對象轉換成C++的string對象
引用自:https://msdn.microsoft.com/zh-cn/library/1b4az623%28VS.80%29.aspx
首先這裡給出兩個方法,具體的轉化方法在這裡給出的方法裡面有,需要瞭解原理的可以看下原文或者方法體
//將s轉換到osvoid MarshalString ( String ^ s, string& os ) { using namespace Runtime::InteropServices; const char* chars = (const char*)(Marshal::StringToHGlobalAnsi(s)).ToPointer(); os = chars; Marshal::FreeHGlobal(IntPtr((void*)chars));}//將s轉換到osvoid MarshalString ( String ^ s, wstring& os ) { using namespace Runtime::InteropServices; const wchar_t* chars = (const wchar_t*)(Marshal::StringToHGlobalUni(s)).ToPointer(); os = chars; Marshal::FreeHGlobal(IntPtr((void*)chars));}
測試範例:
string a = "test";wstring b = L"test2";String ^ c = gcnew String("abcd");cout<<"轉換前:"<<endl;cout<<"a = "<<a<<endl;wcout<<"b = "<<b<<endl;Console::WriteLine("c = " + c); MarshalString(c, a);MarshalString(c, b);cout<<"轉換後:"<<endl;cout<<"String to string: c-->a: a = "<< a << endl;wcout<<"String to wstring: c-->b: b = "<< b << endl;
結果
從這裡看出,String成功轉換成string和wstring
6)在MFC中,將String轉換成CString以及將CString轉換為String
範例:這裡直接給出我寫的函數,很簡單的一個轉換
//String轉換為CStringCString StringToCString(String^ str){ CString cStr = CString((String^)str); return cStr;}//CString轉換為StringString^ CStringToString(CString cStr){ String^ str = gcnew String(cStr); return str;}
4,總結
好了,VC++調用C#初探到此結束了!
做個筆記記錄下這個過程,也讓有需求的人少走彎路!
VC++直接操作使用C#類庫基本操作