跨越語言的障礙:C++/CLI 調(diào)用 C#
首先我想投訴一下博客園首頁右邊欄的廣告..最近總是出現(xiàn)很恐怖的整容臉的廣告。真的是嚇壞了。=。=大家有同感嗎?
博客園前一陣子掀起了語言的廣泛討論,事實(shí)上語言的爭(zhēng)執(zhí)在整個(gè)程序員圈子也沒有停止過。以我個(gè)人看法,語言只是工具,當(dāng)你需要寫底層,你可以使用C++,當(dāng)你需要寫炫目的桌面應(yīng)用可以使用C# WPF,當(dāng)你需要大型網(wǎng)站web開發(fā)時(shí),可以選擇JAVA。當(dāng)然還有其他很多語言。這個(gè)只是面臨不同項(xiàng)目的選擇而已,每種語言都有其擅長的舞臺(tái),而萬年不變的是數(shù)據(jù)結(jié)構(gòu)和算法。一家之言,輕噴。下面正題:
跨越語言的障礙:C++/CLI 調(diào)用 C#
當(dāng)C#項(xiàng)目需要引用C++dll的時(shí)候可以直接使用DLLIMPORT來進(jìn)行調(diào)用。而反向的話,C++項(xiàng)目并不能簡(jiǎn)單靠引用來使用C#DLL。因?yàn)镃++項(xiàng)目默認(rèn)配置是沒有公共語言運(yùn)行庫支持的。所以我們需要更改一些配置來進(jìn)行對(duì)C# dll的調(diào)用。先用托管C++(CLI)將C#的dll進(jìn)行一次封裝,然后由非托管C++調(diào)用封裝好的dll。其中關(guān)鍵步驟c++/cli調(diào)用c#dll 步驟如下:
[感謝緣生夢(mèng) 朋友 補(bǔ)充:此樣例僅做開發(fā)人員調(diào)研使用,c++ clr會(huì)和部分c++編譯選項(xiàng)沖突,而且不支持部分mfc外部鏈接源。]
首先我們完成C# dll開發(fā):
- namespace Csharp
- {
- public class Class1
- {
- public string Name = string.Empty;
- public Class1()
- {
- Name = "We can use C#!!";
- }
- }
- }
編譯就可以獲得Csharp的dll。
其次對(duì)C++項(xiàng)目屬性的配置: 添加公共語言運(yùn)行時(shí)支持 /clr (c++/cli)
下一步添加新引用中選擇我們***步中編譯的Csharp.dll
代碼中需要使用#using和using namespace來進(jìn)行對(duì)dll的調(diào)用。當(dāng)分配內(nèi)存時(shí)注意使用gcnew,需要gc來給其分配內(nèi)存。托管對(duì)象需要使用^來進(jìn)行聲明。
- #include "stdafx.h"
- #using "Csharp.dll"
- using namespace Csharp;
- int _tmain(int argc, _TCHAR* argv[])
- {
- Class1 ^a = gcnew Class1();
- printf("%s/n", a->Name);
- return 0;
- }
運(yùn)行后結(jié)果如下:
如此便可實(shí)現(xiàn)C++/CLI 調(diào)用 C#dll。
至此其他項(xiàng)目中非托管C++代碼便可以調(diào)用該c++dll來進(jìn)行對(duì)托管c#dll的調(diào)用,該dll扮演wrapper的角色。