摘要:使用Visual Studio IDE构建项目时,必须在项目中添加想要引用的任何程序集。为此,请打开解决方案资源管理器,右击想要添加引用的项目,选择“添加引用”。随后会打开“添加引用”对话框,如图2-2所示。 要让项目引用一个程序集,请从列表中选择一个希望的程序集。如果希望的程序集不在列表中,请单击“浏览”标签,并切换到目标程序集(包含一个清单的文件,即程序集的主模块文件),然后添加程序集引用。“添加引用”对话框的“COM”选项卡允许从托管源代码中访问一个非托管COM服务器,这是通过由Visual Studio自动生成的一个托管代理类来实现的。“项目”选项卡允许当前项目引用由同一个解决方... 阅读全文
2.4 将模块合并成程序集
2011-11-22 14:08 by iRead, 834 阅读, 0 推荐, 收藏, 编辑
摘要:上一节讨论的Program.exe文件并非仅仅是一个含有元数据的PE文件,它还是一个程序集。程序集是一个或多个类型定义文件及资源文件的集合。在程序集的所有文件中,有一个文件容纳了清单(manifest)。清单也是一组元数据表的集合,表中主要包含了作为程序集的组成部分的那些文件的名称。此外,它们还描述了程序集的版本、语言文化、发布者、公开导出的类型1以及构成程序集的所有文件。 CLR操作的是程序集。换言之,CLR总是首先加载包含“清单”元数据表的文件,再根据这个“清单”来获取程序集中的其他文件的名称。下面列出了程序集的一些重要特征:程序集定义了可重用的类型程序集标记机了一个版本号程序集可以... 阅读全文
2.3 元数据概述
2011-11-21 21:04 by iRead, 532 阅读, 0 推荐, 收藏, 编辑
摘要:现在,我们知道了自己创建的是什么类型的PE文件。但是,Program.exe文件中到底包含什么内容呢?一个托管PE文件由4个部分组成:PE32(+)头,CLR头,元数据以及IL。PE32(+)头是Windows要求的标准信息。CLR头是一个小的信息块,是那些需要CLR的模块(托管模块)所特有的。在这个头中,包含模块在生成所面向的CLR的major(主)和minor(次)版本号;一些标志(flags);一个MethodDef token(稍后详述),它指定了模块的入口方法(前提是该模块是一个CUI或GUI执行体);以及一个可选的强名称数字签名(将在第3章讨论)。最后,CLR头中还包含模块内部.. 阅读全文
2.2.1 响应文件
2011-11-21 16:23 by iRead, 764 阅读, 0 推荐, 收藏, 编辑
摘要:在结束对编译器开关的讨论之前,我想花一点时间谈谈响应文件(response file)。响应文件是一个文本文件,其中包含一组编译器开关命令行。执行CSC.exe时,编译器会打开响应文件,并使用其中包含的任何开关,感觉就像是这些开关直接在命令行传递给CSC.exe。为了指示编译器使用一个响应文件,在命令行中,请在一个@符号之前指定响应文件的名称。例如,假定一个名为MyProject.rsp的响应文件包含以下文本: /out:MyProject.exe /target:winexe 为了让csc.exe使用这些设置,可以像下面这样调用它: csc.exe @MyProject.rsp ... 阅读全文
2.2 将类型生成到模块中
2011-11-21 16:12 by iRead, 288 阅读, 0 推荐, 收藏, 编辑
摘要:本节要讨论如何将包含多个类型的源代码文件生成为一个可以部署的文件。先来看看这个简单的应用程序:public sealed class Program{ public static void Main() { System.Console.WriteLine("Hi"); }} 应用程序定义了一个名为Program的类型,其中有一个名为Main的public static方法。Main中引用了另一个名为System.Console的类型。System.Console是Microsoft已经实现好的一个类型,用于实现这个类型的各个方法的IL代码存储在MSCor... 阅读全文
2.1 .NET Framework部署目标
2011-11-21 15:48 by iRead, 360 阅读, 0 推荐, 收藏, 编辑
摘要:Microsoft Windows多年来一直因为不稳定和过于复杂而口碑不佳。不管人们对它的评价对不对,之所以会造成目前这种状况,要归咎于几个方面的原因。首先,所有应用程序都使用来自Microsoft或其他产商的动态连接库(DLL)。由于一个应用程序要执行来自多个产商的代码,所以任何一段代码的开发人员都不能百分之百保证别人会以什么方式来使用这段代码。虽然这种交互可能造成各种各样的麻烦,但实际一般不会出太大的问题,因为应用程序在部署之前,会进行严格的测试 和调试。 但对于用户来说,当一家公司决定更新其软件产品的代码,并将新文件发送给他们时,就可能出现问题。这些新文件理论上应该向后兼容于以前的... 阅读全文
第2章 生成、打包、部署和管理应用程序及类型
2011-11-21 15:23 by iRead, 242 阅读, 0 推荐, 收藏, 编辑
摘要:本章类容:.NET Framework部署目标将类型生成到模块中元数据概述将模块合并成程序集程序集版本资源信息语言文化简单应用程序部署(私有部署的程序集)简单管理控制(配置) 在解释如何为Microsoft .NET Framework开发程序之前,首先讨论一下生成、打包和部署应用程序及其类型的步骤。本章重点解释如何生成仅供自己有应用程序使用的程序集。第3章“共享程序集和强命名程序集”将讨论一些更高级的概念,包括如何生成和使用程序集,使其中包含的类型能由多个应用程序共享。在这两章中,我会谈及管理员能采用什么方式来影响一个应用程序及其类型的执行。 当今的应用程序都由多个类型构成,这些类型通常.. 阅读全文
1.9 与非托管代码的互操作性
2011-11-21 10:30 by iRead, 407 阅读, 0 推荐, 收藏, 编辑
摘要:.NET Framework提供了其他开发平台没有的许多优势。但是,能下定决定重新设计和重新实现其现有的全部代码的公司并不多。Microsoft也知道这个问题,并通过CLR来提供了一些机制,允许在应用程序中同时包含托管和非托管代码。具体地说,CLR支持三种互操作情形。托管代码能调用DLL中的一个非托管函数 托管代码可以采取一种名为P/Invoke(Platform Invoke的简称)的机制来调用DLL中包含的函数。毕竟,FCL中定义的许多类型都要在内部调用从Kernel32.dll、User32.dll等导出的函数。许多编程语言都提供了一个机制,允许托管代码方便地调用包含在DLL中的非... 阅读全文
1.8 公共语言规范
2011-11-18 10:41 by iRead, 1190 阅读, 0 推荐, 收藏, 编辑
摘要:COM允许使用不同语言创建的对象相互通信你。现在,CLR集成了所有语言,允许在一种语言中使用由另一种语言创建的对象。之所以能实现这样的集成,是因为CLR使用了标准类型集、元数据(自描述的类型信息)以及公共执行环境。 语言的集成是一个宏伟的目标,最棘手的问题是各种编程语言存在极大的区别。例如,有的语言在处理符号时不区分大小写,有的语言不支持unsigned(无符号)整数、操作符重载或者参数数量可变的方法。 要创建很容易从其他编程语言中访问的类型,只能从自己的编程语言中挑选其他所有语言都确定支持的那些功能。为了在这个方面提供帮助,Microsoft定义了一个“公共语言规范”(Common ... 阅读全文
1.7 通用类型系统
2011-11-17 15:36 by iRead, 358 阅读, 0 推荐, 收藏, 编辑
摘要:CLR是完全围绕类型展开的,这一点到现在为止应该很明显了。类型为应用程序和其他类型公开了功能。通过类型,用一种编程语言写的代码能与用另一种语言写的代码沟通。由于类型是CLR的根本,所以Microsoft制定了一个正式的规范,叫做“通用类型系统”(Common Type System,CTS),它描述了类型的定义和行为。注意:事实上,Microsoft已将CTS和.NET Framework的其他组件--包括文件格式、元数据、中间语言以及对底层平台的访问(P/Invoke)--提交给ECMA以完成标准化工作。最后形成的标准称为“公共语言基础结构”(Common Language Infras.. 阅读全文