İnsanlar ".net çerçevesi" hakkında konuştuğunda, iki ana alanı birleştirme eğilimindedirler - çalışma zamanı kitaplığı ve .net kodunu çalıştıran sanal makine.
C # Visual Studio'da bir sınıf kitaplığı oluşturduğunuzda, DLL, öngörülen bir biçimi izler - çok kabaca, hangi sınıflara dahil edildiğini ve hangi işlevleri, vb. Açıklayan meta verileri içeren ve nerede açıklayan bölüm var. ikili nesnede bu nesneler vardır. Bu yaygın .net biçimi, kitaplıkların .net dilleri (C #, VB.Net, F # ve diğerleri) arasında kolayca paylaşılmasını sağlayan şeydir. .Net "çalışma zamanı kitaplığının" çoğu artık C # ile yazılmış olsa da (inanıyorum), kaçının yönetilmeyen dillerde yazılmış olabileceğini, ancak .net dilleri tarafından tüketilebilecek şekilde bu öngörülen biçimde düzenlenmiş olabileceğini hayal edebilirsiniz. .
Oluşturduğunuz kütüphanenin gerçek "eti", .net'in derleme diline benzeyen CIL'den ("Ortak Ara Dil") oluşur - yine bu dil, tüm .net dillerinin ortak çıktısıdır .net kütüphanelerini herhangi bir .net diliyle tüketilebilir hale getirir.
Microsoft SDK'larda serbestçe bulunan (ve zaten bilgisayarınızda olabilir) "ildasm.exe" aracını kullanarak, C # kodunun meta verilere ve IL'ye nasıl dönüştürüldüğünü görebilirsiniz. Örnek olarak bu cevabın altına bir örnek ekledim.
Yürütme .net kodunu çalıştırdığınızda, genel olarak olan .net sanal makinesi IL'yi okuyor ve işliyor. Bu, .net'in diğer tarafıdır ve yine, bunun kolayca yönetilemeyen bir dilde yazılabileceğini hayal edebilirsiniz - "sadece" VM talimatlarını okumalı ve çalıştırmalı (ve ayrıca ihtiyaç duyulan çöp toplayıcıyla entegre edilmelidir) .net kodu olmamalıdır).
Ne anlattım (tekrar, kabaca) Visual Studio'da bir yürütülebilir dosya oluşturduğunuzda ne olur (daha fazla bilgi için, "CLR üzerinden C # üzerinden Jeffrey Richter" kitabını tavsiye ederim - çok detaylı ve mükemmel yazılmış).
Ancak, bir .net ortamında yürütülmeyecek C # yazabileceğiniz zamanlar vardır - örneğin, Bridge.NET daha sonra tarayıcıda çalıştırılan "C # kodunu" JavaScript'e derler (üreten ekip, .net çalışma zamanı kitaplığının JavaScript'te yazılmış sürümlerini yazma çabası ve böylece .net kitaplığının gücü ve esnekliği oluşturulan JavaScript tarafından kullanılabilir). Bu, C # ve .net arasındaki ayrımın mükemmel bir örneğidir - farklı "hedefler" için C # yazmak mümkündür; .net çalışma zamanı ortamını (yürütülebilir bir dosya oluşturduğunuzda) veya tarayıcı ortamını (Bridge.NET'i kullandığınızda) hedefleyebilirsiniz.
(Çok) basit bir örnek sınıf:
using System;
namespace Example
{
public class Class1
{
public void SayHello()
{
Console.WriteLine("Hello");
}
}
}
Sonuçta elde edilen meta veriler ve IL (ildasm.exe aracılığıyla alınır):
// 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
// =============================================================