Montering (CLI) - Assembly (CLI)

Defineret af Microsoft til brug i nyere versioner af Windows , er en samling i Common Language Infrastructure (CLI) et kompileret kodebibliotek, der bruges til implementering, versionering og sikkerhed. Der er to typer: procesenheder ( EXE ) og biblioteksenheder ( DLL ). En processamling repræsenterer en proces, der bruger klasser defineret i bibliotekssamlinger. CLI-samlinger indeholder kode i CIL , som normalt genereres fra et CLI-sprog og derefter kompileres til maskinsprog ved kørselstidspunktet af just-in-time kompilator . I .NET Framework- implementeringen er denne compiler en del af Common Language Runtime (CLR).

En samling kan bestå af en eller flere filer. Kodefiler kaldes moduler. En samling kan indeholde mere end et kodemodul. Og da det er muligt at bruge forskellige sprog til at oprette kodemoduler, er det teknisk muligt at bruge flere forskellige sprog til at oprette en samling. Visual Studio understøtter dog ikke brug af forskellige sprog i en samling.

Forsamlingsnavne

Navnet på en forsamling består af fire dele

  1. Det korte navn. På Windows er dette navnet på den Portable Executable (PE) fil uden udvidelsen.
  2. Kulturen. Dette er en RFC 1766-identifikator af lokaliteten til forsamlingen. Generelt bør biblioteks- og procesenheder være kulturneutrale; kulturen bør kun bruges til satellitsamlinger .
  3. Versionen. Dette er et prikket tal, der består af fire værdier - major, minor, build og revision.
  4. Et offentligt nøgle- token. Dette er en 64- bit hash af den offentlige nøgle, der svarer til den private nøgle, der bruges til at underskrive samlingen. En underskrevet forsamling siges at have et stærkt navn .

Det offentlige nøgle-token bruges til at gøre forsamlingsnavnet unikt. Således kan to stærke navngivne forsamlinger have det samme PE-filnavn, og alligevel vil CLI genkende dem som forskellige samlinger. Windows- filsystemet ( FAT32 og NTFS ) genkender kun PE-filnavnet, så to samlinger med det samme PE-filnavn (men forskellig kultur, version eller token til offentlig nøgle) kan ikke eksistere i den samme Windows-mappe. For at løse dette problem introducerer CLI GAC ( Global Assembly Cache ), der behandles som en enkelt mappe ved kørselstid, men faktisk implementeres ved hjælp af indlejrede filsystemmapper.

For at forhindre spoofingangreb , hvor en krakker forsøger at aflevere en samling, der ser ud som noget andet, underskrives forsamlingen med en privat nøgle. Udvikleren af ​​den tilsigtede samling holder den private nøgle hemmelig, så en krakker hverken kan få adgang til den eller blot gætte den. Cracker kan således ikke få sin forsamling til at efterligne noget andet og mangler muligheden for at underskrive det korrekt efter ændringen. Undertegnelse af forsamlingen indebærer at tage en hash af vigtige dele af forsamlingen og derefter kryptere hashen med den private nøgle. Den underskrevne hash gemmes i samlingen sammen med den offentlige nøgle. Den offentlige nøgle dekrypterer den underskrevne hash. Når CLR indlæser en stærkt navngivet samling, vil den generere en hash fra samlingen og derefter sammenligne dette med den dekrypterede hash. Hvis sammenligningen lykkes, betyder det, at den offentlige nøgle i filen (og dermed det offentlige nøgle-token) er knyttet til den private nøgle, der bruges til at underskrive samlingen. Dette vil betyde, at den offentlige nøgle i forsamlingen er den offentlige nøgle til forsamlingsudgiveren, og derfor forhindres et spoofing-angreb.

Monteringsversioner

CLI-samlinger kan have versionoplysninger, så de kan eliminere de fleste konflikter mellem applikationer forårsaget af delte samlinger. Dette eliminerer dog ikke alle mulige versionskonflikter mellem forsamlinger.

Samlinger og CLI-sikkerhed

CLI Code Access Security er baseret på samlinger og bevismateriale . Bevis kan være alt udledt fra forsamlingen, men typisk oprettes det fra forsamlingens kilde - uanset om forsamlingen blev downloadet fra internettet, et intranet eller installeret på den lokale maskine (hvis forsamlingen downloades fra en anden maskine opbevares på en sandkasse i GAC og behandles derfor ikke som installeret lokalt). Tilladelser anvendes på hele samlinger, og en samling kan specificere de mindste tilladelser, det kræver gennem brugerdefinerede attributter (se CLI-metadata ). Når samlingen er indlæst, bruger CLR beviset for samlingen til at oprette et tilladelsessæt med en eller flere tilladelser til kodeadgang. CLR kontrollerer derefter for at sikre, at dette tilladelsessæt indeholder de krævede tilladelser, der er specificeret af forsamlingen.

CLI-kode kan udføre en sikkerhedskrav til kodeadgang. Dette betyder, at koden kun udfører en privilegeret handling, hvis alle samlingerne af alle metoderne i opkaldstakken har den specificerede tilladelse. Hvis man gør samlingen ikke tilladelse en sikkerhed undtagelse kastes.

CLI-koden kan også udføre Linked Demand for at få tilladelse fra opkaldstakken. I dette tilfælde vil CLR kun se på en metode i opkaldstakken i TOP-position for den specificerede tilladelse. Her er stack-walk-through bundet til en metode i call stack, hvor CLR antager, at alle de andre metoder i CALL STACK har den specificerede tilladelse. Forsamlingen er en kombination af METADATA- og MSIL-filer.

Satellit forsamlinger

Generelt bør forsamlinger indeholde kulturneutrale ressourcer. Hvis du vil lokalisere din samling (for eksempel bruge forskellige strenge til forskellige lokaliteter), skal du bruge satellitsamlinger - specielle, kun ressourcemæssige samlinger. Som navnet antyder, er en satellit tilknyttet en forsamling kaldet hovedforsamlingen. Denne samling (f.eks. Lib.dll) vil indeholde de neutrale ressourcer (som Microsoft siger er international engelsk , men indebærer at være amerikansk engelsk). Hver satellit har navnet på det tilknyttede bibliotek, der er tilføjet .resources (for eksempel lib.resources.dll). Satellitten får et ikke-neutralt kulturnavn, men da dette ignoreres af eksisterende Windows-filsystemer (FAT32 og NTFS) vil det betyde, at der kunne være flere filer med samme PE-navn i en mappe. Da dette ikke er muligt, skal satellitter gemmes i undermapper under applikationsmappen. For eksempel vil en satellit med britiske engelske ressourcer have et CLI-navn på "lib.resources Version = 0.0.0.0 Culture = en-GB PublicKeyToken = null", et PE-filnavn på lib.resources.dll og vil blive gemt i en undermappe kaldet en-GB.

Satellitter indlæses af en CLI-klasse kaldet System.Resources.ResourceManager . Udvikleren skal oplyse navnet på ressourcen og information om hovedsamlingen (med de neutrale ressourcer). Klassen ResourceManager læser maskinens lokalitet og bruger disse oplysninger og navnet på hovedsamlingen for at få navnet på satellitten og navnet på den undermappe, der indeholder den. ResourceManager kan derefter indlæse satellitten og hente den lokaliserede ressource.

Henvisning til forsamlinger

Man kan henvise til et eksekverbart kodebibliotek ved hjælp af / reference-flag for C # -compilatoren.

Forsinkelse af underskrivelse af en samling

De delte forsamlinger skal give et stærkt navn til entydigt at identificere den samling, der kan deles mellem applikationerne. Den stærke navngivning består af det offentlige nøgle-token, kultur, version og PE-filnavn. Hvis en samling sandsynligvis vil blive brugt til udviklingsformålet, som er en delt samling, indeholder den stærke navngivningsprocedure kun generering af offentlig nøgle. Den private nøgle genereres ikke på det tidspunkt. Det genereres kun, når samlingen er implementeret.

Forsamlingens sprog

Samlingen er opbygget med CIL-koden, som er et mellemliggende sprog. Rammen konverterer CIL ( bytecode ) internt til native samlekode . Hvis vi har et program, der udskriver "Hello World", er den tilsvarende CIL-kode for metoden:

 .method private hidebysig static void  Main(string[] args) cil managed {
  .entrypoint
  .custom instance void [mscorlib]System.STAThreadAttribute::.ctor() = ( 01 00 00 00 )
  // Code size       11 (0xb)
  .maxstack  1
  IL_0000:  ldstr      "Hello World"
  IL_0005:  call       void [mscorlib]System.Console::WriteLine(string)
  IL_000a:  ret } // end of method Class1::Main

CIL-koden indlæser strengen på stakken, kalder derefter funktionen WriteLine og vender tilbage.

Se også

Referencer