用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的支持,如今已经比以前好用多了,若是用在合适的位置,是绝对能让你的开发如鱼得水的。

相关文章
相关标签/搜索