C/C 应用程式路线图
2008-02-23 05:33:54来源:互联网 阅读 ()
为什么要使用公共语言运行库?
Microsoft 总是支持程式员从他们自己的代码中访问操作系统功能。 在 Windows 的早期,我们从 C 语言程式中使用 Windows API ,进行函数调用(比如 GetMessage(), TranslateMessage(), 等等)以达到目的。 随着时间变迁, Windows 功能开始使用 COM 组件比如 Shell 来公开。 为了充分利用 Windows 完整的功能,程式员学会了 COM 的概念,创建了许多 COM 应用程式。 这种演变仍在继续,如今,为了充分发挥 WinFX 的功能,您的应用程式应该使用公共语言运行库,也称 CLR 了。 WinFX 是一种托管 API ,设计成从为 CLR 编写的托管应用程式中调用,通过 WinFX ,您的应用程式能够利用 Avalon 和 Indigo 这样的新技术的功能。 WinFX 是基于 .NET 对象模型的。
访问操作系统功能当然不是 CLR 的唯一优势: .NET Framework 提供了比 COM 和 DCOM 更佳而且更简单的组件模型。 .NET Framework 中包含的托管代码库所能提供的功能,远远超出了操作系统本身,这使我们能够将精力放在应用程式中专门解决特定问题的部分,而用不着再去处理许多人已解决过的问题。 同样,能够构建一个基于组件的解决方案,而不需涉及以前和 COM 和 DCOM 部署相关的那些困难。
相关语言回顾
这是否意味着您应该重新编写任何应用程式呢? 当然不是。 假如原来的应用程式是用 C 编写的,现在不对代码做任何改变就能够针对 CLR 进行编译。 重新编写会带来巨大风险,因为在将程式移植到另一种语言比如 C# 时,可能在能够工作的代码中引入错误。 重新编写和转换代码所能期望的最好值,也但是是实现和以前同样的功能。 假如想以 CLR 为目标平台根本无需这样做。 相反,您的时间和精力能够花在使用新的系统功能和扩展应用程式的功能上。
自 .NET Framework, CLR 和 C# 发布以来的几年中,许多研发人员都对 Microsoft 的 C 计划感到惊奇。 有些人推测 C# 将取代 C ,事实上当然并非如此。 C# 是一种比 C 更容易学习的语言,他提供了访问 CLR 功能的途径。 对于已了解 C 的人来说,要访问 CLR 的功能,无需学习其他语言, C 具备 C# 中没有的功能,因此转向 C# 实际上将会丧失一些能力。
Microsoft Visual C 的每个版本和标准的兼容性都比前一版更好,当前版本 Visual C .NET 2003 ,大约和 ISO C 标准达到了 98% 兼容。 这一版本中访问 CLR 功能的关键字都以双下划线开始,因此不会干扰和标准的兼容性。 虽然这种方式可行,但是很笨拙,而且不够直观。 Visual C 2005 中将包含一个新的 C 到 .NET 的绑定,该绑定正在以 C /CLI 的名称进行标准化。 这一修订包括当前 C 标准中没有的关键字,但是同样不会干扰符合标准的 C 程式,因为他们遵守 ISO C 的标准扩展机制。 C /CLI 扩展的国际标准正在由 ECMA 定制,最终将提交给 ISO 。 和今天的 C# 相同, C /CLI 将被标准化,因此 Microsoft 将不会是 C /CLI 编译器的唯一来源。 Visual C 2005 现在已处于 beta 版,因此我们能够立即探讨这些新的扩展。 在这篇白皮书中,我们将在代码示例中使用新的 C /CLI 语法。 ( CLI 代表的是公共语言基础结构,是 .NET Framework 的标准化部分,包括 .NET 公共语言运行库。)
理解 .NET 上的 C
当您编写在 CLR 上运行的代码时,您所编写的就是托管代码。 标准 C 代码,也就是能够在任何符合标准的 C 编译器上编译的代码,能够编译成非托管(本机)代码或编译成 MSIL : 只需使用一个编译器开关即可。 指定 /clr 选项,编译器就会生成 MSIL ,一个在 CLR 上运行的程式集。 使您的代码成为托管的就是使用 编译器选项。 无需使用任何特别的关键字或太多改变代码(假如需要改变的话),就能够通过 /clr 选项干净利索地进行编译。
编写了托管代码之后,就能够(假如您愿意)使用 CLR 功能了,比如基类库: 这是能够实现 XML 操作、加密解密、数据访问等等功能的强大的类库。 非托管代码,即没有使用 /clr 选项编译的代码,就无法声明托管类的实例,并按托管代码的方式直接调用他们的方法。 能够通过 .NET Interop 从非托管代码中访问托管代码,该技术能够使 .NET 对象看上去像是个 COM 组件。 这种方式和将代码编译成托管的,并直接调用托管代码相比,肯定要慢。
无论是否使用基类库(和其他托管库),您仍然能够用 C 编写程式,仍然拥有 C 赋予您的任何功能和灵活性。 能够使用模板,编写操作符重载,创建内联函数,等等。 编译为 MSIL 并不会阻止您使用任何 C 功能。 比如说,多重继承被排除在外不是因为代码编译为 MSIL 了,而只是因为您编写的是托管代码而已。
托管和非托管类型
一个普通的 C 类,就是编程语言入门课程中教授的那种,将定义一个非托管类型:
class A
{
private:
int x;
public:
A(int xx): x(xx) {}
};
无论是否带 /clr 选项编译代码(托管还是非托管代码),这都是个非托管类型,也俗称为非托管类或非托管数据。 这个类的实例能够分配在堆栈中,这也是编程语言入门课程中教授的内容:
A something(3);
他们还能够在本机或非托管堆中创建:
A* otherthing = new A(4);
程式员然后还必须记住清除非托管堆中的对象,使用 delete 操作符:
delete otherthing;
无论是哪一种方式,都不会涉及垃圾回收器,即使代码编译为 MSIL ,而且应用程式运行在运行库上。
但是您也可能需要编写托管类型(也称托管类或托管数据)。 这些类型能够从其他程式集中调用,其他运行在运行库上的托管代码,无论其他程式集是用什么语言编写的。 用 C# 、用 Visual Basic .NET 或用您没有听说过但是碰巧能编译成 MSIL 的语言编写的代码,都能够使用您的托管类型。 这种交互是由运行库托管的,而且在大多数情况下,您的代码和其他程式集所创建的那些类型实例的生存期也是由运行库托管的。
这些托管类型是第一级的 .NET 对象。 用 C /CLI 创建托管类型,能够采取一种自然的语法,和传统 C 区别不大:
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇: C 语言的VxD和外界通信的任何接口
下一篇: 【知识】什么是嵌入式操作系统?
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash