Wenn Leute über das ".net Framework" sprechen, kombinieren sie normalerweise zwei Hauptbereiche - die Laufzeitbibliothek und die virtuelle Maschine, auf der der .net-Code tatsächlich ausgeführt wird.
Wenn Sie eine Klassenbibliothek in Visual Studio in C # erstellen, folgt die DLL einem vorgeschriebenen Format. Grob gesagt gibt es einen Abschnitt, der Metadaten enthält, in denen beschrieben wird, welche Klassen darin enthalten sind und welche Funktionen sie haben usw. und in denen beschrieben wird, wo In der Binärdatei existieren diese Objekte. Dieses gemeinsame .net-Format ermöglicht die einfache gemeinsame Nutzung von Bibliotheken zwischen .net-Sprachen (C #, VB.Net, F # und anderen). Obwohl ein Großteil der .net- "Laufzeitbibliothek" jetzt in C # geschrieben ist (glaube ich), können Sie sich vorstellen, wie viele von ihnen in nicht verwalteten Sprachen geschrieben, aber in diesem vorgeschriebenen Format angeordnet sein könnten, damit sie von .net-Sprachen verwendet werden können .
Das eigentliche "Fleisch" der Bibliothek, die Sie erstellen, besteht aus CIL ("Common Intermediate Language"), das der Assemblersprache von .net ein wenig ähnelt. Auch diese Sprache ist die gemeinsame Ausgabe aller .net-Sprachen macht .net-Bibliotheken für jede .net-Sprache nutzbar.
Mit dem Tool "ildasm.exe", das in Microsoft SDKs frei verfügbar ist (und sich möglicherweise bereits auf Ihrem Computer befindet), können Sie sehen, wie C # -Code in Metadaten und IL konvertiert wird. Ich habe ein Beispiel am Ende dieser Antwort als Beispiel eingefügt.
Wenn Sie Execute .net Code ausführen, passiert häufig, dass die virtuelle .net Virtual Machine diese IL liest und verarbeitet. Dies ist die andere Seite von .net, und Sie können sich wahrscheinlich vorstellen, dass dies leicht in einer nicht verwalteten Sprache geschrieben werden kann - es muss "nur" VM-Anweisungen lesen und ausführen (und in den Garbage Collector integrieren, der ebenfalls benötigt wird) nicht .net Code sein).
Was ich beschrieben habe, ist (wieder ungefähr), was passiert, wenn Sie eine ausführbare Datei in Visual Studio erstellen (für weitere Informationen empfehle ich das Buch "CLR via C # von Jeffrey Richter" - es ist sehr detailliert und hervorragend geschrieben).
Es kann jedoch vorkommen, dass Sie C # schreiben, das nicht in einer .net-Umgebung ausgeführt wird. Beispielsweise "kompiliert" Bridge.NET C # -Code in JavaScript, das dann im Browser ausgeführt wird (das Team, das es erstellt hat) Der Aufwand für das Schreiben von Versionen der .net-Laufzeitbibliothek, die in JavaScript geschrieben sind, und damit die Leistungsfähigkeit und Flexibilität der .net-Bibliothek für das generierte JavaScript. Dies ist ein perfektes Beispiel für die Trennung zwischen C # und .net - es ist möglich, C # für verschiedene "Ziele" zu schreiben. Sie können auf die .net-Laufzeitumgebung abzielen (wenn Sie eine ausführbare Datei erstellen) oder auf die Browserumgebung (wenn Sie Bridge.NET verwenden).
Eine (sehr) einfache Beispielklasse:
using System;
namespace Example
{
public class Class1
{
public void SayHello()
{
Console.WriteLine("Hello");
}
}
}
Die resultierenden Metadaten und IL (abgerufen über ildasm.exe):
// Metadata version: v4.0.30319
.assembly extern mscorlib
{
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4..
.ver 4:0:0:0
}
.assembly Example
{
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilationRelaxationsAttribute::.ctor(int32) = ( 01 00 08 00 00 00 00 00 )
.custom instance void [mscorlib]System.Runtime.CompilerServices.RuntimeCompatibilityAttribute::.ctor() = ( 01 00 01 00 54 02 16 57 72 61 70 4E 6F 6E 45 78 // ....T..WrapNonEx
63 65 70 74 69 6F 6E 54 68 72 6F 77 73 01 ) // ceptionThrows.
// --- The following custom attribute is added automatically, do not uncomment -------
// .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggableAttribute/DebuggingModes) = ( 01 00 07 01 00 00 00 00 )
.custom instance void [mscorlib]System.Reflection.AssemblyTitleAttribute::.ctor(string) = ( 01 00 0A 54 65 73 74 49 4C 44 41 53 4D 00 00 ) // ...TestILDASM..
.custom instance void [mscorlib]System.Reflection.AssemblyDescriptionAttribute::.ctor(string) = ( 01 00 00 00 00 )
.custom instance void [mscorlib]System.Reflection.AssemblyConfigurationAttribute::.ctor(string) = ( 01 00 00 00 00 )
.custom instance void [mscorlib]System.Reflection.AssemblyCompanyAttribute::.ctor(string) = ( 01 00 00 00 00 )
.custom instance void [mscorlib]System.Reflection.AssemblyProductAttribute::.ctor(string) = ( 01 00 0A 54 65 73 74 49 4C 44 41 53 4D 00 00 ) // ...TestILDASM..
.custom instance void [mscorlib]System.Reflection.AssemblyCopyrightAttribute::.ctor(string) = ( 01 00 12 43 6F 70 79 72 69 67 68 74 20 C2 A9 20 // ...Copyright ..
20 32 30 31 36 00 00 ) // 2016..
.custom instance void [mscorlib]System.Reflection.AssemblyTrademarkAttribute::.ctor(string) = ( 01 00 00 00 00 )
.custom instance void [mscorlib]System.Runtime.InteropServices.ComVisibleAttribute::.ctor(bool) = ( 01 00 00 00 00 )
.custom instance void [mscorlib]System.Runtime.InteropServices.GuidAttribute::.ctor(string) = ( 01 00 24 31 39 33 32 61 32 30 65 2D 61 37 36 64 // ..$1932a20e-a76d
2D 34 36 33 35 2D 62 36 38 66 2D 36 63 35 66 36 // -4635-b68f-6c5f6
32 36 36 31 36 37 62 00 00 ) // 266167b..
.custom instance void [mscorlib]System.Reflection.AssemblyFileVersionAttribute::.ctor(string) = ( 01 00 07 31 2E 30 2E 30 2E 30 00 00 ) // ...1.0.0.0..
.custom instance void [mscorlib]System.Runtime.Versioning.TargetFrameworkAttribute::.ctor(string) = ( 01 00 1C 2E 4E 45 54 46 72 61 6D 65 77 6F 72 6B // ....NETFramework
2C 56 65 72 73 69 6F 6E 3D 76 34 2E 35 2E 32 01 // ,Version=v4.5.2.
00 54 0E 14 46 72 61 6D 65 77 6F 72 6B 44 69 73 // .T..FrameworkDis
70 6C 61 79 4E 61 6D 65 14 2E 4E 45 54 20 46 72 // playName..NET Fr
61 6D 65 77 6F 72 6B 20 34 2E 35 2E 32 ) // amework 4.5.2
.hash algorithm 0x00008004
.ver 1:0:0:0
}
.module Example.dll
// MVID: {80A91E4C-0994-4773-9B73-2C4977BB1F17}
.imagebase 0x10000000
.file alignment 0x00000200
.stackreserve 0x00100000
.subsystem 0x0003 // WINDOWS_CUI
.corflags 0x00000001 // ILONLY
// Image base: 0x05DB0000
// =============== CLASS MEMBERS DECLARATION ===================
.class public auto ansi beforefieldinit Example.Class1
extends [mscorlib]System.Object
{
.method public hidebysig instance void
SayHello() cil managed
{
// Code size 13 (0xd)
.maxstack 8
IL_0000: nop
IL_0001: ldstr "Hello"
IL_0006: call void [mscorlib]System.Console::WriteLine(string)
IL_000b: nop
IL_000c: ret
} // end of method Class1::SayHello
.method public hidebysig specialname rtspecialname
instance void .ctor() cil managed
{
// Code size 8 (0x8)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void [mscorlib]System.Object::.ctor()
IL_0006: nop
IL_0007: ret
} // end of method Class1::.ctor
} // end of class Example.Class1
// =============================================================