laasunde
February 21st, 2008, 04:28 AM
Recently I started looking into visual studio utilties such as dumpbin.exe and ildasm.exe to get a better understanding of assemblies in dotnet. A few questions came up and I'd appreciate some input.
// The executable is developed using vs 2005.
// dumpbin /all exename (copied only clr header section)
clr Header:
48 cb
2.05 runtime version
19930 [ F6E4] RVA [size] of MetaData Directory
1 flags
60000BC entry point token
CDB0 [ CB80] RVA [size] of Resources Directory
0 [ 0] RVA [size] of StrongNameSignature Directory
0 [ 0] RVA [size] of CodeManagerTable Directory
0 [ 0] RVA [size] of VTableFixups Directory
0 [ 0] RVA [size] of ExportAddressTableJumps Directory
0 [ 0] RVA [size] of ManagedNativeHeader Directory
// The executable is developed using vs 2002.
// dumpbin /all exename (copied only clr header section)
clr Header:
48 cb
2.00 runtime version
BC14 [ B82C] RVA [size] of MetaData Directory
1 flags
6000004 entry point token
A358 [ 18BC] RVA [size] of Resources Directory
0 [ 0] RVA [size] of StrongNameSignature Directory
0 [ 0] RVA [size] of CodeManagerTable Directory
0 [ 0] RVA [size] of VTableFixups Directory
0 [ 0] RVA [size] of ExportAddressTableJumps Directory
0 [ 0] RVA [size] of ManagedNativeHeader Directory
The following 1.0.3705, 1.1.4322, 2.0.50727 .NET versions are installed on my computer.
1. Why does the CLR header operate with runtime version 2.00 and 2.05? I would expect the application built with vs2002 to use .NET 1.1 and the project built with vs2005 to use .NET version 2.0. The above information does not make sence to me.
2. Does mscoree.dll use the runtime version info in the clr header to determine which clr to use?
// The executable is developed using vs 2005.
// ildasm exefile (copied only first section of manifest)
// Metadata version: v2.0.50727
.module extern user32.dll
.assembly extern mscorlib
{
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4..
.ver 2:0:0:0
}
.assembly extern System
{
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4..
.ver 2:0:0:0
}
.assembly extern System.Drawing
{
.publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A ) // .?_....:
.ver 2:0:0:0
}
.assembly extern System.Windows.Forms
{
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4..
.ver 2:0:0:0
}
3. In the above output all .NET assemblies ref to verion 2.0.0.0. None of these files exist on my computer with version 2.0.0.0. They all use 2.0.50727. How does this work?
// The executable is developed using vs 2005.
// dumpbin /all exename (copied only clr header section)
clr Header:
48 cb
2.05 runtime version
19930 [ F6E4] RVA [size] of MetaData Directory
1 flags
60000BC entry point token
CDB0 [ CB80] RVA [size] of Resources Directory
0 [ 0] RVA [size] of StrongNameSignature Directory
0 [ 0] RVA [size] of CodeManagerTable Directory
0 [ 0] RVA [size] of VTableFixups Directory
0 [ 0] RVA [size] of ExportAddressTableJumps Directory
0 [ 0] RVA [size] of ManagedNativeHeader Directory
// The executable is developed using vs 2002.
// dumpbin /all exename (copied only clr header section)
clr Header:
48 cb
2.00 runtime version
BC14 [ B82C] RVA [size] of MetaData Directory
1 flags
6000004 entry point token
A358 [ 18BC] RVA [size] of Resources Directory
0 [ 0] RVA [size] of StrongNameSignature Directory
0 [ 0] RVA [size] of CodeManagerTable Directory
0 [ 0] RVA [size] of VTableFixups Directory
0 [ 0] RVA [size] of ExportAddressTableJumps Directory
0 [ 0] RVA [size] of ManagedNativeHeader Directory
The following 1.0.3705, 1.1.4322, 2.0.50727 .NET versions are installed on my computer.
1. Why does the CLR header operate with runtime version 2.00 and 2.05? I would expect the application built with vs2002 to use .NET 1.1 and the project built with vs2005 to use .NET version 2.0. The above information does not make sence to me.
2. Does mscoree.dll use the runtime version info in the clr header to determine which clr to use?
// The executable is developed using vs 2005.
// ildasm exefile (copied only first section of manifest)
// Metadata version: v2.0.50727
.module extern user32.dll
.assembly extern mscorlib
{
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4..
.ver 2:0:0:0
}
.assembly extern System
{
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4..
.ver 2:0:0:0
}
.assembly extern System.Drawing
{
.publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A ) // .?_....:
.ver 2:0:0:0
}
.assembly extern System.Windows.Forms
{
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4..
.ver 2:0:0:0
}
3. In the above output all .NET assemblies ref to verion 2.0.0.0. None of these files exist on my computer with version 2.0.0.0. They all use 2.0.50727. How does this work?