VC++直接操作使用C#類庫基本操作

來源:互聯網
上載者:User

標籤: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#類庫基本操作

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.