`
jack
  • 浏览: 392460 次
  • 来自: 温州
社区版块
存档分类
最新评论

C++,C++/CLI混合编程

阅读更多
   从2001年.net平台开始发布到现在,C++/CLI已经存在了好几年。以前叫mc++,现在改名为C++/CLI,有些人认为C++/CLI是一种新语言,有的只是认为是C++的一个扩展。C++/CLI是完全基于.NET平台之上。C++/CLI的出现给C++项目开发带来了不少的变化。可惜由于.NET平台目前还没有完全覆盖windows的全部操作系统,C++/CLI也只能用于服务器程序的开发。用来编写客户端程序,分发成本实在不低。
 
   光从用途来看C++/CLI是.NET平台和iso c++之间的一个过渡桥梁,一个 ISO c++项目走向.net项目的一个单向桥梁。抛开各种政治上的,信仰上的考虑,.NET平台的确带来了不少吸人眼球的技术。在尝试着开发了几个c#1.1项目之后,由于c#1.1项目开发过于死板。于是一直等待到.NET 2.0发布,.NET平台开始进入成熟时期,我开始尝试着在近期的C++项目中引入.NET技术。.NET2.0以前的版本和.NET 2.0之间差异很大,这样的开发方式最好在vc2005上尝试。vc 2003,vc 2002和vc.net 上都是存在一定缺陷的,而且相互之间的代码也不能完全兼容。

   try-catch-exception,ado.net是羡慕已久的2项.NET技术了。终于可以在项目中尝试一把了。
   
   ISO C++自身也带有try,catch关键字。无论从使用角度还是实际效果方面都没有.NET的try-catch爽。.NET 的try-catch关键字有.NET强力支持,在查找bug和预防程序崩溃方面异常有用。基本上能避免应用程序完全崩溃。

  ado.net和其扩展Microsoft.Practices.EnterpriseLibrary.Data在操作database方面异常的方便。比起C++需要使用各种api或者ado来操作数据库,完全是2个世界的。

  最终完成的项目,99%的代码是ISO C++编写,数据库操作代码和部分try-catch用C++/CLI。C++/CLI的语法以及常用操作符号和ISO C++差异很大,很容易就能分辨出哪些是ISO C++代码,那些C++/CLI代码。在维护上也没有太多问题。不过实际开发过程中,如果不做控制,C++/CLI的代码最终会“蔓延”开来,越来越多。

   最后编译下来,部分ISO C++、C++/CLI代码编译成了.net的中间代码。部分ISO C++代码则还是二进制代码。完全是一个"怪物"应用程序。vc 2005的cl的确有些夸张,这样都能够编译。ISO C++和C++/CLI在某些角度来看是完全两种语言。cl居然能够分辨出来做出不同的编译.
 
  实际运行下来,这样的开发方式完全是可以接受的。数据库操作部分的代码不在有以前使用ado时候那种拖沓、难看的代码了。.NET版本try-catch的引入,使得程序稳定性增强不少。

附一段C++/CLI的操作数据库代码

try
	{
		Database^ db = nullptr;
		String^ sqlCommand = nullptr;
		DbCommand^ dbCommand = nullptr;
		IDataReader^ dataReader = nullptr;

		db = DatabaseFactory::CreateDatabase();

		String ^ temp = nullptr;

		sqlCommand = String::Format("select * from table where ID = {0} and type=1 ",ID);
		dbCommand = db->GetSqlStringCommand(sqlCommand);
		dataReader = db->ExecuteReader(dbCommand);
		if (dataReader->Read())
		{
			temp= (String^)dataReader[0];
		}

	}
	catch(Exception^ ex)
	{
		Console::Write(ex->ToString());
	}




 

分享到:
评论
12 楼 rtdb 2006-10-28  
runes 写道
rtdb 写道
我们是重新设计,充分发挥NET的优势,不算是翻版。

就算是翻版,我也认为比C++/CLI混合模式好,太复杂,太难维护了。
又要会C++,又要明白NET,这样的复合型人才,实在是不好找。
组建这样的一个团队,难度太大。



嘿嘿,关键你还要明白 .NET里面的C++,。。。。。。。。。
确实,这也是个我选择放弃C++/CLI的内在因素之一,
作为C++的FANS,好好的C++,让他们给搞成了这样子,
还好意思说自己是搞C++的么    :)

11 楼 runes 2006-10-27  
rtdb 写道
我们是重新设计,充分发挥NET的优势,不算是翻版。

就算是翻版,我也认为比C++/CLI混合模式好,太复杂,太难维护了。
又要会C++,又要明白NET,这样的复合型人才,实在是不好找。
组建这样的一个团队,难度太大。



嘿嘿,关键你还要明白 .NET里面的C++,。。。。。。。。。
10 楼 rtdb 2006-10-27  
我们是重新设计,充分发挥NET的优势,不算是翻版。

就算是翻版,我也认为比C++/CLI混合模式好,太复杂,太难维护了。
又要会C++,又要明白NET,这样的复合型人才,实在是不好找。
组建这样的一个团队,难度太大。

9 楼 jack 2006-10-27  
rtdb 写道
很讨厌C++/CLI。
我们的产品本是基于VC6的,新版本全部用C#重新开发了,
只有一点底层操作库还是用C++写的,供C#调用。


如果是服务器段产品,不妨用下C++/CLI,用C#改写,不知道你们怎么考虑的。就我自己经验来说,最忌讳这种翻版工作了。
8 楼 rtdb 2006-10-26  
很讨厌C++/CLI。
我们的产品本是基于VC6的,新版本全部用C#重新开发了,
只有一点底层操作库还是用C++写的,供C#调用。
7 楼 jack 2006-10-24  
Elminster 写道
原来你是在说 .net 里面 exception 的 stack trace 的支持,我想岔了。这个没错,stack trace 没有运行时系统或是虚拟机的支持不怎么好做,ISO C++ 里面没法加的。


虽然在windows上用API可以stack trace,不过够麻烦的。远没有.NET如此方便.
6 楼 Elminster 2006-10-24  
原来你是在说 .net 里面 exception 的 stack trace 的支持,我想岔了。这个没错,stack trace 没有运行时系统或是虚拟机的支持不怎么好做,ISO C++ 里面没法加的。
5 楼 jack 2006-10-24  
Elminster 写道
我比较奇怪楼主为何强调 try catch 这个方面的问题,在我看来 .net 的异常支持并没有什么比 ISO C++ 强大的地方。能说说么?


#include "stdafx.h"

class A
{
public:
	int a;
	void foo()
	{
		printf("foo %d",a);
	};
};
int _tmain(int argc, _TCHAR* argv[])
{
	try
	{
		A b;
		A *a  = new A;
		a = NULL;
		a->foo();
	}
	catch(...)
	{
		printf("failed");
	}
	return 0;
}


这个例子 输出 "failed"


#include "stdafx.h"

using namespace System;
using namespace System::Data;
using namespace System::Data::Common;
using namespace System::Runtime::InteropServices;

class A
{
public:
	int a;
	void foo()
	{
		printf("foo %d",a);
	};
};
int _tmain(int argc, _TCHAR* argv[])
{
	try
	{
		A b;
		A *a  = new A;
		a = NULL;
		a->foo();
	}
	catch(Exception ^ex)
	{
	Console::Write(ex->ToString());
	}
	return 0;
}


这个例子输出
引用

System.NullReferenceException: Object reference not set to an instance of an object.
   at A.foo(A* ) in d:\temp\foo\foo\foo.cpp:line 17
   at wmain(Int32 argc, Char** argv) in d:\temp\foo\foo\foo.cpp:line 27


以上2个例子,全部release版本编译.


ps:这个空行真是难看,明明我贴代码的时候没有这么多空行的,奇怪
4 楼 fixopen 2006-10-24  
C++/CLI支持try catch finally?
3 楼 Elminster 2006-10-24  
我比较奇怪楼主为何强调 try catch 这个方面的问题,在我看来 .net 的异常支持并没有什么比 ISO C++ 强大的地方。能说说么?
2 楼 jack 2006-10-23  
runes 写道
个人以为,移植老的cpp程序,不浪费已有的资源,用一下C++/CLI,还是不错的

.NET全新的项目,干吗不用C#呢?


C++本来就够复杂的可以了,C++/CLI搞得更复杂。


一是项目所需。
另外一个C#1.0,C#1.1对于一个用惯C++的技术人员来说,束手束脚的地方实在太多。经常能写出一堆有类似逻辑,但是因为语法上的原因而无法合并的函数。C#2.0则因为引入范型这类概念,就好过很多了。

虽然整个C++体系的确很复杂,不过项目中能够用到的技术并不是很多,对项目本身来说影响并不大。就怕对某项C++技术一知半解,却当作项目核心技术在使用。


1 楼 runes 2006-10-23  
个人以为,移植老的cpp程序,不浪费已有的资源,用一下C++/CLI,还是不错的

.NET全新的项目,干吗不用C#呢?


C++本来就够复杂的可以了,C++/CLI搞得更复杂。

相关推荐

    C++/CLI教程

    标题:“C++/CLI教程”指的是一个专门针对C++/CLI(C++ Common Language Infrastructure)编程语言的教程。C++/CLI是微软设计的一种编程语言,旨在将C++的强大功能与.NET平台的互操作性相结合。它允许开发者使用C++...

    C#通过C++/CLI间接调用NativeCPP类的DLL文件

    C++/CLI是Microsoft为.NET框架设计的一种编程语言,它允许开发者编写混合模式的代码,即同时包含托管代码(.NET)和非托管代码(C++)。C++/CLI提供了一种机制,使得C++类可以被.NET环境理解和使用,同时也能够调用...

    自己辛苦搜集的网上关于c++/cli编程资料(word,60页,中文)

    1. **托管与非托管代码**:C++/CLI允许在同一个程序中混合使用托管(由.NET管理)和非托管(C++原生)代码,这对于既有C++遗留代码又希望利用.NET服务的项目非常有用。 2. **CLI关键字**:`ref class`是C++/CLI中的...

    Expert C++/CLI

    本书《Expert C++/CLI: .NET for Visual C++ Programmers》由Marcus Heege编写,是一本专为想要深入理解如何在.NET环境中利用Visual C++进行编程的读者而设计的书籍。以下是对本书涉及的主要知识点的详细解析。 ###...

    C++/CLI in Action source code

    《C++/CLI in Action 源代码》是关于C++/CLI编程实践的一份宝贵资源,其中包含了书中示例程序的源代码。C++/CLI是Microsoft为.NET框架开发的一种语言扩展,它使得C++程序员能够充分利用.NET的特性,如托管代码、垃圾...

    Expert C++ / CLI .NET for Visual C++ Programmers (带完整目录)

    In a very similar way, C++/CLI is layered on top of C++. C++/CLI provides a high degree of source code compatibility with C++. As a consequence, the following code is valid if you build the program ...

    C++/CLI 语言规范英文版本

    1. **托管与非托管代码**:C++/CLI允许混合编写托管代码(运行于.NET Framework上的代码)和非托管代码(传统的C++代码)。这使得开发者可以利用现有的C++库,并与.NET组件无缝集成。 2. **引用类型和值类型**:C++...

    C++/CLI学习

    C++/CLI是一种微软开发的语言扩展,它使得C++能够无缝地与.NET Framework交互,提供了一种混合编程的机制,可以同时利用C++的强大功能和.NET的便利性。本资料主要针对C++/CLI的学习,旨在帮助开发者理解和掌握这一...

    C++/CLI in Action

    《C++/CLI in Action》是一本旨在帮助程序员更好地掌握C++/CLI编程技术的专业书籍。它不仅适合那些已经熟悉.NET框架并希望进一步了解如何在其中使用C++的开发者,也适用于那些对C++有一定基础并希望将其技能扩展到...

    完美的C++:C++CLI

    C++/CLI 是一种混合语言,它结合了 C++ 语言的静态对象模型和 CLI 的动态组件编程模型。C++ 语言是由 Bjarne Stroustrup 在 BELL 实验室发明的,它实现了运行时取得速度和尺寸最佳化的静态对象模型,但它除了堆分配...

    c++/cli 标准

    C++/CLI标准是C++编程者在.NET环境中进行开发的重要参考。 C++/CLI的核心特性包括: 1. **托管代码与非托管代码交互**:C++/CLI允许开发者编写同时包含托管(.NET)和非托管(本机C++)代码的程序。这使得在已有...

    C++-CLI.in.Action

    该书通过深入浅出的方式介绍了如何利用 C++/CLI 这种混合语言编程技术来开发同时支持托管代码与非托管代码的应用程序。 #### 二、C++/CLI 的核心概念 ##### 1. 托管代码与非托管代码 - **托管代码**:指运行在 .NET...

    VC.NET C++/CLI

    1. **托管代码与非托管代码**:C++/CLI能够编写混合模式的代码,即同时包含托管代码(运行在.NET Framework之上的代码)和非托管代码(传统的C++代码,直接运行在操作系统上)。托管代码享有.NET Framework提供的...

    C++/CLI for C# Developers

    C++/CLI 是一种结合了 C++ 和 .NET Framework 的编程语言,它允许开发人员编写同时利用原生 C++ 性能优势和 .NET Framework 功能的应用程序。这种语言特别适合那些希望在保持现有 C++ 技能的同时,能够利用 .NET ...

    cli.rar_C++/CLI_blabla_empty

    标题中的"cli.rar_C++/CLI_blabla_empty"表明这是一个与C++/CLI相关的内容,C++/CLI是微软.NET框架中的一种编程语言,它扩展了标准C++,使其能够与.NET Framework的组件交互。"empty main c function"描述可能指的是...

    C++/CLi书籍Visual C++.net

    - **混合模式编程**:C++/CLI支持混合模式编程,即同时编写托管代码和非托管代码。这使得开发者可以在同一个项目中结合使用C++的性能优势和.NET的安全性及生产力优势。 - **引用类型与值类型**:在C++/CLI中,可以...

    C++/CLI课件

    - **托管与非托管代码**:C++/CLI支持编写混合模式代码,即可以同时包含运行在.NET框架上的托管代码和传统的C++非托管代码。 - **装箱与拆箱**:在C++/CLI中,值类型可以被装箱为对象引用,反之也可以通过拆箱返回...

    Ecma-C++/CLI

    托管C++/CLI是微软推出的一种混合语言,它结合了C++的强大功能和.NET框架的安全性与生产力。这种语言的主要特点是支持与.NET Framework的无缝集成,包括对.NET类型的直接操作、垃圾回收机制以及.NET类库的使用。C++/...

    C++/CLI 规范英文版

    C++/CLI是一种混合型编程语言,它允许程序员在C++语法的基础上编写面向对象的代码,并与.NET Framework无缝集成。该文档的发布时间为2005年8月22日,由Ecma/TC39-TG5/2005/024发布,版本号为Working Draft 1.14。 #...

    C++/CLI计算器(窗口文字输入版)

    C++/CLI是Microsoft提出的一种混合编程语言,它结合了C++的语法和.NET Framework的组件模型,使得开发者能够使用C++来创建和操作.NET Framework的托管代码。在这个项目中,我们探讨的是一个基于C++/CLI的简易计算器...

Global site tag (gtag.js) - Google Analytics