ssembly详解

然后,你可以用ILDM查看一下这个配件中究竟定义了什么。

私有配件和共享配件之间有什么区别?

私有配件通常只被一个应用程序使用,一般它被保存在应用程序目录,或者其子目录下面.。而共享配件通常保存在全局的配件catch缓冲区中, 它是一个由.Net运行时环境维护的配件仓库。

共享配件通常是许多程序都要使用的代码库,比如.Net框架的类库就是如此。

事实上, 我们应该如下区分三种配件:

* 私有(private):

只对一个应用程序可见; 这是缺省配置, 其它的应用程序不能对其引用,这个配件必须在应用程序目录或者其子目录下面有个拷贝.

* 公有(public):

对其它的应用程序可见, 不管它在什么目录下面(可以是URL),其它的应用程序都可以对其直接引用.

* 公有共享(public shared):

Net环境怎样查找配件?

当然是按照路径查找, 规则如下:

* 在应用程序所在目录及其子目录下面私有配件

* 对于共享组件, 除了上面的规则, 再加上.Net提供的共享配件缓冲区路径.

配件怎样版本化?

我们已经知道所有的类型对象是使用全局的ID标识的, 那么配件是怎样版本化呢?

版本号分为4个部分(举例, 5.5.2.33). 分类如下:

不兼容: 前两个不同

可能兼容: 前两个相同, 第3个不同

兼容: 前三个相同, 第4个不同

如果你正确的编译你的代码,assembly就会以DLL或者EXE的形式保存在磁盘上。像这样保存在物理磁盘上的assembly被称为静态assembly。

当启动一个.NET应用程序的时候,程序首先要检查自己的安装目录中是否有需要的assembly,如果几个程序运行,那么每个都要在自己的安装目录中查找自己需要的assembly。也就是说每个程序都使用自己的assembly备份,这样的assembly称为私有assembly。它们只在应用程序的安装目录范围内有效。

一些情况下,你可以发现多个应用程序需要使用共享的assembly而不只是使用他们自己的,对这种情况,你可以在全局assembly缓存(译者:Global Assembly Cache,这个翻译有点不伦不类,大家明白就好)中管理该assembly(后面会提到)。这样的assembly在全局过程中有效,可以被机器内的所有程序共享,被称为共享Assembly。如果应用程序不能在自己的安装目录中得到需要的assembly,它将在全局assembly缓存中查找。如果愿意你可以考虑把你的assembly成为共享assembly。

Assembly可以把你从DLL地狱中解救出来。

Assembly支持并行(side-by-side execution)执行

这么说有点不好理解,不过很简单,也就是说同一assembly的不同版本可以在同一个机器上同时执行。不同的应用程序

Assembly是自描述的

配置简化

卸载容易

不需要注册表,当然简单的删掉就算是卸载了。

载创建一个assembly之前,我们先来了解一下assembly的组成结构。Assembly由以下几部分组成:

Assembly Manifest(译者:Assembly清单?不贴切,其实类似于一个目录或者入口)

包含assembly的数据结构的细节。

包含assembly中允许的类型数据。(前面提到过,class, interface,member, property等)

单文件和多文件Assembly

下面我们了解一下assembly manifest的更详细的信息。Assembly manifest保存了assembly细节的数据结构。对多文件assembly来说,assembly manifest好像一个“绑定器”把多个文件绑定到一个assembly中。请注意Manifest和Metadata并不相同,Metadata保存的是在assembly和module里用到的数据类型(如class, interface, method等)的相应信息,而Manifest是用来描述assembly本身结构的细节信息的。

对单文件Assembly来说,Manifest嵌在DLL或EXE文件内,对多文件assembly, Manifest可以内嵌在每个文件中也可以存在于一个委托(constituent)文件里。后面将会有详细说明。

下面列出了Manifest中的主要信息:

Metadata

Metadata数据是对assembly中数据的定义。每个EXE或DLL包含自己的详细的类型信息,这种数据叫Metadata。主要包括以下信息:

Modules

创建单文件Assemblies

创建多文件的Assembly

这里我们将建立一个叫CompanyStaff的assembly,包括两个类Clerk和Manager。下面我们看看创建多文件assembly的两种办法:

第一种方法是分别编译Clerk和Manager两个类到不同的modules中,然后把两个modules加到CompanyStaff DLL中去得到最终的assembly。这时CompanyStaff DLL将管理assembly manifest。这种方法可以用正常的命令行编译实现。(这里是CSC)

使用命令行编译器创建多文件assembly

我们将进行以下步骤:

Step1: 创建Clerk Module

用命令行编译这个类:

这里/t:module开关告诉编译器把代码编译成一个module。

用下面的命令行形式编译:

Step3: 创建CompanyStaff assembly

用下面的命令行形式编译:

Step4: 创建一个客户程序来使用assembly

用下面的命令行形式编译:

用AL工具创建一个多文件assembly

输入下面的命令行:

编译上面的代码并运行,你可以得到和前面的例子一样的结果。

共享式assembly和全局assembly缓存

到目前为止,我们看到的都是私有式的assembly。当然在.NET应用中,我们多数都在单独的使用一些私有式的assembly,然而有时候你可能会需要在很多个应用程序中共享一个单独的assembly的备份。我们前面提到过,共享assembly需要把assembly放到全局assembly缓存中去(Global Assembly Cache)。全局assembly缓存是磁盘上一个特殊的目录,一般它位于<driver>\WINNT\ASSEMBLY目录下。注意当安装过.NET后,这个目录在explorer下显示和其他目录有点不同,如果想看一下它的实际内容,你可以用命令行的形式来查看。

注意:不能简单的把你的assembly copy到这个目录下。首先你需要给你的assembly一个strong name,然后可以用AL把这个assembly安装到全局assembly缓存中去。

Strong Name

Versioning

向前面看到的那样,多数时候,.NET assembly被用作私有模式。对这样的assembly,因为它们都位于应用程序自己的目录下,所以versioning看起来并不是十分重要。然而对共享式assembly来说,versioning是很重要的。共享式assembly可以以并行的形式使用(前面提到过并行使用的概念),因此完全有可能在同一台机器上存在同一个assembly的不同版本。当应用程序要使用一个assembly时候,它就应该提供最近的或以前的版本的信息。如果开发者需要使用不同版本,就需要在代码中明确的设置版本号,其格式如下:

<major version>.<minor version>.<build number>.<revision>

Runtime将通过前两个参数来决定当前使用的版本是否和以前的版本兼容(major version和minor version)。如果这两个参数有变化,那么assembly将被认为是不兼容的,全局assembly缓存会为该assembly生成一个单独的入口,如果在代码中指定了版本号的话,major version就是可选的了。

下面显示了.NET如何将同一个assembly(EmployeeShared)的不同版本视为不同的assembly的例子。

创建一个共享式的assembly

现在你应该已经知道什么是共享式assembly了,下面我们将创建一个叫EmployeeShared的assembly。创建一个共享式assembly包括以下几个步骤:

Step1: 创建assembly代码并在代码中指定其版本号

我们创建了这个类,包含一个属性Name和一个方法GetSalary。注意AssemblyVersionAttribute的用法,它为该assembly设置了版本信息。

Step2: 用SN工具创建一个公钥/私钥对

为了给你的assembly赋一个Strong Name,你需要一个公钥/私钥对。可以使用.NET SDK提供的工具SN (Shared Name),输入以下命令行:

该命令在指定文件里创建了一个钥匙对,参数-k表示我们要把钥匙对写到输出文件里。

扩展名.SNK只是个习惯,你可以让它叫任何名字。

Step 3: 编译assembly并用上一步中创建的公钥/私钥对签名

你也可以在这个文件里加上我们前面提过的般本号属性而不用在源代码里指定。

Step4: 在全局assembly缓存中安装该assembly

我们的assembly已经用过私钥签名了,下面可以把它放在全局assembly缓存中了。像前面一样使用AL,命令行如下:

开关/I表示我们要将assembly安装到全局assembly缓存中。

好了,现在assembly被安装在全局assembly缓存并且可以使用了。想验证一下的话到explorer中看一下Assembly目录。

有时候你可能需要分析assembly,尤其是别人开发的assembly。这种情况下你可以使用一个叫ILDASM (Intermediate Language Disassembler)的工具。这个工具就象我们从前用过的OLE View或者VB的object viewer一样,你可以把你的assembly或者module导入这个工具来查看assembly各方面的特性,比如它包含的member, method和manifest。看起来就像下面这样。

你可以通过双击树结构中的节点得到更多的信息。

assembly是.NET的组成模块。.NET应用程序由一个或者多个assembly组成。一个.NET assembly由一个或多个文件组成并且在其自身的manifest中保存自己的注册信息。通常一个assembly只为一个应用程序服务,这样的assembly叫做私有式assembly。你也可以通过配置让一个assembly的copy为多个应用程序服务。这样的assembly叫做共享式assembly。共享式assembly在全局assembly缓存中被管理。共享式assembly必须有一个在整个机器范围内唯一标识的strong name。

THE END
0.国产AI工具百花齐放各显神通本篇介绍同一题材,通过三亇AI绘图工具,绘出来了三组完全不同风格的画,Al工具引入后,全国AI工具像雨后春笋一般涌现出来。可谓在人工智能大道上“万马奔腾”“百花齐放”,也看出我国学习人工智能的成长道路选择上也各有千秋。 老翁用了二亇免费的AI智能工具,写文,咨询,绘图获益匪浅。丰富了老年生活,也增加了知识面。jvzquC41yy}/onnrkct/ew475mvc{‚<
1.al智能:如何利用al工具高效学习?当代大学生必备技能随着科技的飞速发展,我们有幸迎来了一个颇具魅力的新时代,这个时代,被有趣的小工具点亮了。说起这些“小助手”,你可能会想到手机、电脑等,但我今天要给大家介绍的是那些古灵精怪又高效的AL工具。它们就像是我们学习的魔法道具,能够让你的学习效率提升到一个全新的境界——al智能工具。 jvzquC41yy}/uqfpi{kykwjk0ipo8ftvkimg862;6:45@3jvor
2.渗透测试工具大全在Java中,注解是一种用于描述代码的元数据,它可以被编译器、库和其他工具读取和使用。MyBatis的注解就是用来简化XML配置的,它们可以 云端源想YD 154998围观2024-01-18 流量分析及流量特征识别总结原创 攻防演练 Wireshark的常见使用,常见的恶意流量特征(菜刀,蚁剑,哥斯拉,冰蝎等,Nmap,http,ftp,dns等) jvzquC41yy}/h{jgdwl/exr1ctzjeuju1ykc1<=;82
3.免费临时匿名收件邮箱在线工具大全在线工具工具介绍每次分享的临时匿名邮箱内容都非常受欢迎,这次就再次整理一次免费临时匿名收件邮箱在线工具大全,更全面,每个都测试过,只分享免费的、好用的、可以访问的匿名邮箱在线工具。匿名临时邮箱截图名称网址时长临时邮箱jvzquC41yy}/ym||0ipo8wwcppjcw4mw|nbp89860nuou
4.工具大全工具查询在线工具好查询网为您整理了在线工具合集,免费工具,工具查询,工具大全,在线工具,在线工具查询,免费工具大全等各种免费工具,欢迎您的使用。jvzq<84yyy4icx7940ipo8
5.免费查询工具免费实用查询工具实用查询工具大全查询网为广大网友提供免费查询工具,免费实用查询工具,实用查询工具大全,实用工具,生活工具,在线查询,查询工具。免费查询实用工具尽在查询网。jvzq<84yyy4r:;60eqs0
6.漫画大全创曹 iPad için tasarlandı Ücretsiz Uygulama İçi Satın Alımlar Sunar Ekran Görüntüleri iPad iPhone Açıklama 漫画大全,快看高清漫画大全 热门高清漫画阅读工具 功能: - 支持漫画收藏功能 - 支持漫画关键词搜索功能 - 支持自动存储阅读记录 jvzquC41crvt0jurng4dqv4vt1gqr8*G8'HD'JG'G9+:6.GD'G;&C=*C9'K6'A:'C:3&GB*CD'?9'N;'D:+97.J8'DI&CK*G9'?5'KG'G;+::.=7'G>&CO*DD'K6'K<'C7+F7.=7'D=0km<474957?8An?zs
7.AI365导航网官网|1000+AI工具集合,国内外AI工具集导航大全AI365导航网收录了国内外数百个AI工具,该导航网站包括AI写作工具、AI图像生成和背景移除、AI视频制作、AI音频转录、AI辅助编程、AI音乐生成、AI绘画设计、AI对话聊天等AI工具集合大全,以及AI学习开发的常用网站、框架和模型,帮助你加入人工智能浪潮,自动化高效完成任务jvzq<84yyy4bkmm5874dqv4
8.供应W7Cr4Mo4v2,W10MO4Cr4V3AL高速工具钢,质量问题随时退换宝钢可供SAE1074 SAE1078 SK4 SK5碳素工具钢 3680元/吨 优质钢材 高速工具钢 s7工具钢 碳素工具钢 面议 100Cr2 德国撒斯特 210C 碳素工具钢 36.00元 专业供应T8A碳素钢 T8碳素工具钢 12.80元 供应100Cr6 100CrMn6 轴承钢 法国碳素工具钢 28.00元 供应工具钢jvzquC41o0sbmnuqnq4dqv4rtqjve}4322944B:;7:9/j}rn
9.爬虫大全,爬虫工具汇总C++WebFountainEdwards et al.2001 年一个与Mercator类似的分布式的模块化的爬虫,但使用C++编写。它的特点是一个管理员机器控制一系列的蚂蚁机器。经过多次下载页面后,页面的变化率可以推测出来,这时,一个非线性的方法必须用于求解方程以获得一个 最大的新鲜度的访问策略。作者推荐在早期检索阶段使用这个爬虫,然后用统jvzquC41dnuh0lxfp0tfv8|gkzooa<8947>198ftvkimg8igvcomu8=798<64=
10.甘肃抽查电动工具等16类产品合格率93.8%中国质检网消息甘肃省质量技术监督局近日通报节能建材、电动工具等16类产品质量监督检查结果。本次监督检查了452家生产(经销)企业的550批次产品,合格516批次,产品抽样检验合格率为93.8%。 今年第3季度,甘肃省质量技术监督局委托有关省级质检机构对全省生产和销售的节能建材、电动工具、电热淋浴器、电风扇(含换气扇)、发jvzquC41yy}/ezs0eqs/ew4ou1ipp}jpv1813:2341871ltpvgtua:9466:50qyo
11.兰斯10SSG兰斯10SSG及SpoilerAL6.2和转码工具整合包下载兰斯10 SSG及SpoilerAL6.2和转码工具整合包,由“tt_9891”制作,新增可改死亡率,军力,部分人物经验,星数等功能,附带Spoiler6.2以及转码工具,本站提供兰斯10SSG,需要的玩家不要错过哦! 资源详情: 最新版的,除基本内容外,可改死亡率,军力,部分人物经验、星数等 jvzquC41fn44fvlcog4dqv4rcvii1:7442:/j}rn