用C++/CLI搭建C++和C#之間的橋樑(一)—— 簡介

C#和C++是很是類似的兩種語言,然而咱們卻經常將其用於兩種不一樣的地方,C#得益於其簡潔的語法和豐富的類庫,經常使用來構建業務系統。C++則具備底層API的訪問能力和拔尖的執行效率,每每用於訪問底層模塊和構建有性能要求的算法。html

這兩種場景看起來有較大的差別,大多數的時候能夠各行其道。但仍是有不少時候會出現融合的狀況。當咱們構建分佈式系統的時候,因爲RPC機制通常都是語言無關的,咱們大能夠將其各盡所長,按需劃分在最能發揮其長處的位置。然而,一旦咱們須要構建融合二者需求的集中式系統的時候,就會頭痛無比。算法

此時,咱們可使用C++/CLI搭建C++和.Net之間的橋樑,C++/CLI是一個比較有意思的兩棲模塊,它具備以下特色分佈式

  1. 既能夠訪問.Net類庫,也能夠訪問C++原生類庫
  2. 既能夠被.Net程序引用,也能夠被C++原生程序引用

使用C++/CLI,咱們可使用C++編寫算法,用C#編寫界面,也可使用.Net Framework類庫加強C++程序功能,各取所長。關於的優勢,園子裏有篇文章介紹的比較詳細,值得一讀:從C++到C++/CLI性能

下面咱們就以一個簡單的例子來演示一下它的用法:spa

Calculator.h: htm

    #pragma once

    namespace CppCliTest
    {
        public ref class Calculator
        {
        public:
            int Add(int a, int b);
        };
    }
blog

 

Calculator.cpp 開發

    #include "stdafx.h"
    #include "Calculator.h"

    namespace CppCliTest
    {
        int Calculator::Add(int a, int b)
        {
            return a + b;
        }
    }
文檔

 

main.cpp get

    #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的支持,如今已經比以前好用多了,若是用在合適的位置,是絕對能讓你的開發如魚得水的。

相關文章
相關標籤/搜索