Un mese fa avevo scritto due post (questo e questo) su programmi vuoti in C#. Oggi vorrei completare il quadro anche per altri linguaggi .NET, con il tabellone qui sotto che spero parli un po' da sé. Non sono riuscito a individuare le opzioni giuste per il compilatore Visual C++ (cl.exe) (con i vostri commenti magari riuscirò a completare la tabella anche per C++ e, perché no, per altri linguaggi .NET).
Quattro commenti soltanto:
- in Visual C# .NET non c'è bisogno di referenziare assembly che supportino
la compilazione e la generazione di codice (come "Microsoft.VisualBasic.dll",
"vjscor.dll", "Microsoft.JScript.dll");
- Visual Basic .NET referenzia l'assembly "Microsoft.VisualBasic.dll"
senza utilizzarlo;
- sorprendentemente, la dimensione dell'assembly per JScript .NET (3584 byte) è ben inferiore alla dimensione dell'assembly per J# .NET (20480 byte), pur corrispondendo a un codice IL ben più lungo (sabotage Java? - scherzo);
lo stesso si verifica con Visual Basic .NET (2560 byte) se confrontato con
Visual C# .NET (3072 byte) - non mi aspettavo :-)
- il compilatore JScript .NET addiritura genera una classe, dal nome "JScript 0" (attenzione allo spazio bianco!).
(Aggiornamento 07/11/04): Grazie a Corrado
per la parte VB.
Linguaggio .NET |
Compilatore |
IL |
Dimensione DLL in byte |
IL |
ilasm |
.module fooil.DLL .imagebase 0x00400000 .subsystem 0x00000003 .file alignment 512 .corflags 0x00000001 |
1536 |
Visual C# .NET |
csc |
.assembly extern mscorlib { .publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) .ver 1:0:5000:0 } .assembly foocs { .hash algorithm 0x00008004 .ver 0:0:0:0 } |
.module foocs.dll .imagebase 0x00400000 .subsystem 0x00000003 .file alignment 512 .corflags 0x00000001 | |
3072 |
Visual Basic .NET |
vbc |
.assembly extern mscorlib
{
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 )
.ver 1:0:5000:0
} |
.assembly extern Microsoft.VisualBasic
{
.publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A )
.ver 7:0:5000:0
} |
.assembly foovb
{
.hash algorithm 0x00008004
.ver 0:0:0:0
} |
.module foovb.dll
.imagebase 0x00400000
.subsystem 0x00000002
.file alignment 512
.corflags 0x00000001 |
|
2560 |
J# .NET |
vjc |
.assembly extern vjscor { .publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A ) .ver 1:0:5000:0 } |
.assembly extern mscorlib { .publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) .ver 1:0:5000:0 } .assembly fooj { |
.custom instance void [vjscor]com.ms.vjsharp.cor.VJSharpAssemblyAttribute::.ctor(valuetype [vjscor]com.ms.vjsharp.cor.VJSharpAssemblyGeneratorType, string) = ( 01 00 00 03 31 2E 30 00 00 ) |
.hash algorithm 0x00008004 .ver 0:0:0:0 } |
.module fooj.dll .imagebase 0x00400000 .subsystem 0x00000003 .file alignment 4096 .corflags 0x00000001 | |
20480 |
JScript .NET |
jsc |
.assembly extern Microsoft.JScript { .publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A ) .ver 7:0:5000:0 } |
.assembly extern mscorlib { .publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) .ver 1:0:5000:0 } .assembly foojs { |
.custom instance void [Microsoft.JScript]Microsoft.JScript.ReferenceAttribute::.ctor(string) = ( 01 00 4E 6D 73 63 6F 72 6C 69 62 2C 20 56 65 72 73 69 6F 6E 3D 31 2E 30 2E 35 30 30 30 2E 30 2C 20 43 75 6C 74 75 72 65 3D 6E 65 75 74 72 61 6C 2C 20 50 75 62 6C 69 63 4B 65 79 54 6F 6B 65 6E 3D 62 37 37 61 35 63 35 36 31 39 33 34 65 30 38 39 00 00 ) |
.hash algorithm 0x00008004 .ver 0:0:0:0 } |
.module 'JScript Module' .imagebase 0x00400000 .subsystem 0x00000003 .file alignment 512 .corflags 0x00000001 |
.class public auto ansi 'JScript 0' extends [Microsoft.JScript]Microsoft.JScript.GlobalScope { } .class public auto ansi 'JScript 0' extends [Microsoft.JScript]Microsoft.JScript.GlobalScope { .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGlobalScopeAttribute::.ctor() = ( 01 00 00 00 ) .method public specialname rtspecialname instance void .ctor(class [Microsoft.JScript]Microsoft.JScript.GlobalScope A_1) cil managed { .maxstack 3 IL_0000: ldarg.0 IL_0001: ldarg.1 IL_0002: dup IL_0003: ldfld class [Microsoft.JScript]Microsoft.JScript.Vsa.VsaEngine [Microsoft.JScript]Microsoft.JScript.ScriptObject::engine IL_0008: call instance void [Microsoft.JScript]Microsoft.JScript.GlobalScope::.ctor(class [Microsoft.JScript]Microsoft.JScript.GlobalScope, class [Microsoft.JScript]Microsoft.JScript.Vsa.VsaEngine) IL_000d: ret } .method public instance object 'Global Code'() cil managed { .maxstack 2 IL_0000: ldarg.0 IL_0001: ldfld class [Microsoft.JScript]Microsoft.JScript.Vsa.VsaEngine [Microsoft.JScript]Microsoft.JScript.ScriptObject::engine IL_0006: ldarg.0 IL_0007: call instance void [Microsoft.JScript]Microsoft.JScript.Vsa.VsaEngine::PushScriptObject(class [Microsoft.JScript]Microsoft.JScript.ScriptObject) IL_000c: ldnull IL_000d: ldarg.0 IL_000e: ldfld class [Microsoft.JScript]Microsoft.JScript.Vsa.VsaEngine [Microsoft.JScript]Microsoft.JScript.ScriptObject::engine IL_0013: call instance class [Microsoft.JScript]Microsoft.JScript.ScriptObject [Microsoft.JScript]Microsoft.JScript.Vsa.VsaEngine::PopScriptObject() IL_0018: pop IL_0019: ret } } | |
3584 |