【文章标题】: NET程序集02
【文章作者】: 有酒醉
【作者邮箱】: wuqr32@sina.com
【下载地址】: 自己搜索下载
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
二、程序集的逻辑结构
1、程序集的标识
程序集的标识由4项组成:名称,版本,公钥,文化.
名称 -- 包含了主模块的文件的文件名
版本 -- 由4个数字组成,分别代表主版本、次版本、构建和修订版
示例1 - 标识当前程序集的版本
.asssembly MyAssembly
{
.ver 2:1:345:0
}
示例2 - 标识引用程序集的版本
.assembly extern SomeLibrary
{
.ver 2:0:0:0
}
注意;在引用其他程序集时,要确保编译器定位和检验的程序集的版本与在运行时要加载的版本是一致的.
公钥/私钥 -- 可选项,如果将程序集放置到全局程序集缓存中,则必须对程序集进行签名.被签名的程序集具有强名称.
文化 -- 标识被下载的资源.文化分为:语言、区域.如,en-GB 表示在英国使用英语,en-US 表示在美国使用英语
2、读取程序集的内容
ildasm -- ildasm 无法查看共享程序集中的代码,除非你知道它们的具体位置.
示例3 - 以高级模式启动
cmd > ildasm /adv
更多选项查看帮助.
DumpBin -- 该工具为所有的PE文件和COFF文件设计,允许用户查看所有PE题头信息.添加/CLR可允许用户查看CLR题头.
托管类反射 -- System.Reflection类允许用户以编程的方式检验程序集或类型,同时允许实例化类型及调用它们的方法
示例4 - 查看System.Drawing.dll的信息
using System;
using System.Reflection;
public class DrawingInfo
{
public static void Main(string[] args)
{
string windir = Environment.GetEnvironmentVariable("windir");
Assembly ass = Assembly.LoadFrom(windir +
@"/Microsoft.NET/Framework/v1.1.4322/System.Drawing.dll");
foreach(Type type in ass.GetTypes())
Console.WriteLine(type.ToString());
}
}
非托管的反射API -- 允许对程序集中的元数据和头信息进行更多的访问.ildasm内在使用非托管的反射API.
示例5 - 查阅DrawingInfo.exe(示例4)所有的元信息
cmd > cd YourPath/SDK/v1.1/Tool Developers Guide/Samples/metainfo
cmd > vcvars32.bat
cmd > nmake /f metainfo.mak // 生成metainfo.exe
cmd > metainfo DrawingInfo.exe
以下为截取:
TypeRef #7 (01000007)
-------------------------------------------------------
Token: 0x01000007
ResolutionScope: 0x23000001
TypeRefName: System.Console
MemberRef #1
-------------------------------------------------------
Member: (0a000007) WriteLine:
CallCnvntn: [DEFAULT]
ReturnType: Void
1 Arguments
Argument #1: String
Signature #1
-------------------------------------------------------
CallCnvntn: [LOCALSIG]
5 Arguments
Argument #1: String
Argument #2: Class System.Reflection.Assembly
Argument #3: Class System.Type
Argument #4: SZArray Class System.Type
Argument #5: I4
Assembly
-------------------------------------------------------
Token: 0x20000001
Name : DrawingInfo
Public Key :
Hash Algorithm : 0x00008004
Major Version: 0x00000000
Minor Version: 0x00000000
Build Number: 0x00000000
Revision Number: 0x00000000
Locale:
Flags : [SideBySideCompatible] (00000000)
CustomAttribute #1 (0c000001)
-------------------------------------------------------
CustomAttribute Type: 0a000001
CustomAttributeName: System.Diagnostics.DebuggableAttribute :: i
nstance void .ctor(bool,bool)
Length: 6
Value : 01 00 00 01 00 00 >
<
ctor args: ( )
AssemblyRef #1
-------------------------------------------------------
Token: 0x23000001
Public Key or Token: b7 7a 5c 56 19 34 e0 89
Name: mscorlib
Major Version: 0x00000001
Minor Version: 0x00000000
Build Number: 0x00001388
Revision Number: 0x00000000
Locale:
HashValue Blob:
Flags: [none] (00000000)
User Strings
-------------------------------------------------------
70000001 : ( 6) L"windir"
7000000f : (53) L"/Microsoft.NET/Framework/v1.1.4322/System.Drawing.dll"
Coff symbol name overhead: 0
具体如何应用非托管反射API请查阅SDK/v1.1/Tool Developers Guide/doc下的Metadata Unmanaged API.doc
3、探讨程序集缓存
程序集缓存包含了共享的程序集(GAC),执行ngen的程序集中的本地图象,以及从远程机器中下载的将被执行的程序集的副本
程序集缓存的shfusion视图 -- 通过shfusion.dll隐藏程序集的内在细节结构显示在windows的浏览器中.
示例6 - 查看程序集缓存
打开/windows/assembly文件夹.assembly下有一个逻辑文件夹download,它放置从Internet或内部网中下载的程序集的位置
download文件夹中的"基本代码"(codebase)可以构成评估在多大的程度上信任应用程序的证据.
真正的程序集缓存结构 -- 通过regsvr32 -u shfusion.dll 取消shfusion注册即可.或采用命令方式(dir)
cmd > regsvr32 -u shfusion.dll
重新浏览assembly可以发现GAC.
4、使用gacutil.exe将程序集放到缓存器中时,gacutil只读取程序集的名称,公钥,版本以及文化.同时创建适当的文件夹并将文件复制到文件夹中.此文件夹的结构可以参照程序集缓存中其他的程序集.
--------------------------------------------------------------------------------
【版权声明】: 本文原创于泉州软件基地, 转载请注明作者并保持文章的完整, 谢谢!
2007年03月27日 21:46:10