用C++/CLI搭建C++和C#之间的桥梁(一)—— 简介
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的支持,现在已经比之前好用多了,如果用在合适的位置,是绝对能让你的开发如鱼得水的。
最新文章
- Rehosting the Workflow Designer
- CentOS 6.8 LAMP 安装配置
- 漫谈Linux内核哈希表(2)
- BZOJ1088: [SCOI2005]扫雷Mine
- bootstrap 响应式布局
- Ubuntu配置java环境变量
- MVC1
- 8张图带你理解Java整个只是网络(转载)
- 如何定位到append的当前位置,不用拉滚动条scrollIntoView方法
- .net mvc 防止 xss 与 CSRF
- ms-grid layout
- VBoxManage命令详解
- PowerShell为什么强大
- hdu 4585 Shaolin_set用法
- Windows下用WinSCP传输数据到Linux上
- [python学习笔记] 开篇
- Apple Watch 开发详解
- java-信息安全(六)-基于RSA理解数字签名示例
- SPRING框架中ModelAndView、Model、ModelMap区别及详细分析
- elementui常用知识点总结
热门文章
- juery给所有ID属性相同的div绑定一个事件
- 头像截图上传三种方式之一(一个简单易用的flash插件)(asp.net版本)
- Ubuntu 下查看已安装的软件
- Maven整合Spring与Solr
- spring(四)之基于注解(Annotation-based)的配置.md
- 进程一些命令pstree,ps,pstack,top
- HTML+CSS小技巧
- (MHA+MYSQL-5.7增强半同步)高可用架构设计与实现
- beego学习笔记(4):开发文档阅读(5)
- [实战]MVC5+EF6+MySql企业网盘实战(9)——编辑文件名