C#和C++是非常相似的兩種語言,然而我們卻常常將其用於兩種不同的地方,C#得益於其簡潔的語法和豐富的類庫,常用來構建業務系統。C++則具有底層API的訪問能力和拔尖的執行效率,往往用於訪問底層模塊和構建有性能要求的算法。
這兩種場景看起來有較大的差異,大多數的時候可以各行其道。但還是有很多時候會出現融合的情況。當我們構建分布式系統的時候,由於RPC機制一般都是語言無關的,我們大可以將其各盡所長,按需划分在最能發揮其長處的位置。然而,一旦我們需要構建融合兩者需求的集中式系統的時候,就會頭痛無比。
此時,我們可以使用C++/CLI搭建C++和.Net之間的橋梁,C++/CLI是一個比較有意思的兩棲模塊,它具有如下特點
-
既可以訪問.Net類庫,也可以訪問C++原生類庫
-
既可以被.Net程序引用,也可以被C++原生程序引用
使用C++/CLI,我們可以使用C++編寫算法,用C#編寫界面,也可以使用.Net Framework類庫增強C++程序功能,各取所長。關於的優點,園子里有篇文章介紹的比較詳細,值得一讀:從C++到C++/CLI。
下面我們就以一個簡單的例子來演示一下它的用法:
Calculator.h:
#pragma once
namespace CppCliTest
{
public ref class Calculator
{
public:
int Add(int a, int b);
};
}
Calculator.cpp
#include "stdafx.h"
#include "Calculator.h"
namespace CppCliTest
{
int Calculator::Add(int a, int b)
{
return a + b;
}
}
main.cpp
#include "stdafx.h"
#include "Calculator.h"
using namespace System;
using namespace CppCliTest;
int main(array<System::String ^> ^args)
{
Calculator^ calculator = gcnew Calculator();
int result = calculator->Add(3, 2);
Console::WriteLine(L"Result is {0}", result);
return 0;
}
從這個例子中,我們可以簡單的管中窺豹的看看C++/CLI是在C++的基礎上擴充了一套語法,使其具有訪問.Net原始的功能,這里用到的有:
-
使用 ref class聲明 CLI引用類型(C#中的class)
-
使用 ^ (例如如這里的 String ^) 來定義CLI引用類型
-
使用 gcnew 創建CLI的引用類型
具體的功能我將在后面的文章中再做介紹,MSDN中也有文檔詳細的介紹了這些語法:https://msdn.microsoft.com/zh-cn/library/ms235289.aspx
雖然C++/CLI同時具有兩者的功能,但它使得本就比較復雜的C++語法變得更加復雜了(特別是初期的版本,非常復雜,現在已經簡化了不少了),並且長期沒有得到VisualStudio這宇宙第一IDE的較好支持(在VS2010的時候還不支持智能提示),是無法與擁有大量語法糖的C#比開發效率的。加上大多數需求場景可以通過分布式系統解決,這些都導致了它一直沒有得到太多的關注。但是,微軟還是在積極的改進它的,加上C++11的支持,現在已經比之前好用多了,如果用在合適的位置,是絕對能讓你的開發如魚得水的。