除了发布IL,每个针对CLR的编译器都会将完整的metadata发布到每个managed模块中。简而言之,metadata是数据表集,而这些数据表描述了模块中定义的内容,比如类型和他们的成员。另外,metadata也包含managed模块中的引用,比如导入类型和他们的成员。 Metadata是早期技术比如COM的类库和IDL文件的一个超级集合。这里要注意的一点是CLR metadata尚不完整。并且,不像类库和IDL,Metadata 总是跟包含IL代码的文件相关联。事实上,Metadata总是嵌入在代码的EXE/DLL中,代码和metadata不可分离。因为编译器同时产生metadata和代码,这两者相互之间时刻都保持同步,并且最终绑定到managed模块。
 
    metadata有很多用处。以下是其中的一些:
 
  • Metadata在编译时删除了 native c/c++头文件和类库文件 ,因为所有有关引用类型/成员的信息被包含在IL文件中,IL实现了类型/成员。 编译器可以直接从managed 模块中直接读取metadata.
  • 微软Visual Studio使用metadata来帮助你写代码。Visual studio中的智能提示通过分析metadata来告诉你会某类型会提供什么方法、属性、事件和字段,告诉你某方法有哪些参数。
  •  CLR的代码检测流程使用metadata来确保你的代码只作"type-safe"的操作。(我会在后面马上讲解代码检测)
  • Metadata允许对象的字段序列化到内存块中,发送给另外一台远程机器,然后反序列化,在远程机器上重新创建对象的状态。
  • Metadata允许垃圾回收器跟踪对象的生命周期。对于任何对象,垃圾回收器都可以确定对象的类型,并且通过metadata,拉加回收器可以知道对象中的哪些字段引用了其他的对象。
  •  

     在第二章“编译,打包,发布和管理应用程序和类型”,我会进一步详细描述metadata.
     微软的c#,VB,F#和IL集总是产生包含managed code(IL)和managed data(垃圾回收的数据类型)的模块。为了执行任何包含managed code或managed data的模块,最终用户必须在他们的机器上安装CLR(现在随.NET Framework发布),就像他们必须有MFC类库或者VB dlls来运行MFC或者VB6应用程序。
     默认情况下,微软的c++编译器编译包含unmanaged code的EXE/DLL模块并且在运行时操控unmanaged data。这些模块执行时不需要CLR。然而,通过制定CLR 命令行 switch,c++编译器会产生包含managed code的模块,当然你必须先安装CLR。在提到的所有微软编译器中,C++是唯一一个允许开发者同时写managed和unmanaged代码的编译器,并且最终发布到一个模块中。同时也是唯一一个允许开发者在源代码中同时定义managed和unmanaged数据类型。相比其他的编译器,微软的c++编译器提供了更大的灵活性,因为它允许开发者在managed 代码中使用他们现有的native c/c++代码,并且在合适的地方开始集成地使用managed 类型。
 
把managed模块整合为程序集 
     事实上,CLR和Assembly一起工作,而不是模块。Assembly是一个在一开始比较难理解的抽象的概念。首先,一个Assembly在逻辑上,是一个或者多个模块或资源文件的集合。其次,Assembly是重用、安装和版本的最小单元。根据编译器或者工具的选择,你可以产生一个文件或者多个Assembly。在CLR世界里,Assembly就是我们所说的组件(Component)。
     我会在第二章详细地讲解Assembly,所以本章不会再进一步讲述Assembly。这里要提到一点的是另外的概念就是提供了方法把一组文件作为一个单独的实体。
      图1-2可以解释了什么是程序集。在这个图中,一些managed模块和资源文件被一个工具处理。这个工具产生一个PE32(+)文件来表示逻辑上的一组文件。这个PE32(+)文件包含了一块数据叫manifest.Manifest是另外一组metadata表。这些表描述了组成程序集的文件、程序集中实现公开导出类型的文件、和程序集相关联的资源或数据文件。
     

posted on 2010-05-23 13:10  gracestoney  阅读(69)  评论(0编辑  收藏  举报