Naast elkaar uitvoeren in .NET Framework
Notitie
Dit artikel is specifiek voor .NET Framework. Dit geldt niet voor nieuwere implementaties van .NET, waaronder .NET 6 en nieuwere versies.
Naast elkaar uitvoeren is de mogelijkheid om meerdere versies van een toepassing of onderdeel op dezelfde computer uit te voeren. U kunt meerdere versies van de algemene taalruntime en meerdere versies van toepassingen en onderdelen hebben die tegelijkertijd een versie van de runtime gebruiken op dezelfde computer.
In de volgende afbeelding ziet u verschillende toepassingen die gebruikmaken van twee verschillende versies van de runtime op dezelfde computer. Toepassingen A, B en C gebruiken runtimeversie 1.0, terwijl toepassing D runtimeversie 1.1 gebruikt.
Het .NET Framework bestaat uit de algemene taalruntime en een verzameling assembly's die de API-typen bevatten. De runtime en de .NET Framework-assembly's worden afzonderlijk geversied. Versie 4.0 van de runtime is bijvoorbeeld versie 4.0.319, terwijl versie 1.0 van de .NET Framework-assembly's versie 1.0.3300.0 is.
In de volgende afbeelding ziet u verschillende toepassingen die gebruikmaken van twee verschillende versies van een onderdeel op dezelfde computer. Toepassing A en B gebruiken versie 1.0 van het onderdeel terwijl Application C versie 2.0 van hetzelfde onderdeel gebruikt.
Naast elkaar uitvoeren krijgt u meer controle over welke versies van een onderdeel een toepassing verbindt en meer controle over welke versie van de runtime een toepassing gebruikt.
Voordelen van side-by-side uitvoering
Vóór Windows XP en .NET Framework zijn DLL-conflicten opgetreden omdat toepassingen geen onderscheid konden maken tussen incompatibele versies van dezelfde code. Typegegevens in een DLL waren alleen gebonden aan een bestandsnaam. Een toepassing had geen manier om te weten of de typen in een DLL dezelfde typen waren waarmee de toepassing is gebouwd. Als gevolg hiervan kan een nieuwe versie van een onderdeel een oudere versie overschrijven en toepassingen onderbreken.
Naast elkaar uitvoeren en .NET Framework bieden de volgende functies om DLL-conflicten te voorkomen:
Sterk benoemde assembly's.
Bij de uitvoering naast elkaar worden sterk benoemde assembly's gebruikt om typegegevens te binden aan een specifieke versie van een assembly. Hiermee voorkomt u dat een toepassing of onderdeel wordt gebonden aan een ongeldige versie van een assembly. Met sterk benoemde assembly's kunnen ook meerdere versies van een bestand op dezelfde computer bestaan en door toepassingen worden gebruikt. Zie Sterk benoemde assembly's voor meer informatie.
Versiebewuste codeopslag.
.NET Framework biedt versiebewuste codeopslag in de globale assemblycache. De globale assemblycache is een computerbrede codecache die aanwezig is op alle computers waarop .NET Framework is geïnstalleerd. Hiermee worden assembly's opgeslagen op basis van versie-, cultuur- en uitgeversinformatie en worden meerdere versies van onderdelen en toepassingen ondersteund. Zie Global Assembly Cache voor meer informatie.
Isolatie.
Met behulp van .NET Framework kunt u toepassingen en onderdelen maken die geïsoleerd worden uitgevoerd. Isolatie is een essentieel onderdeel van de uitvoering naast elkaar. Het omvat het bewust zijn van de resources die u gebruikt en resources deelt met vertrouwen tussen meerdere versies van een toepassing of onderdeel. Isolatie omvat ook het opslaan van bestanden op een versiespecifieke manier. Zie Richtlijnen voor het maken van onderdelen voor side-by-side-uitvoering voor meer informatie over isolatie.
Versiecompatibiliteit
Versies 1.0 en 1.1 van .NET Framework zijn ontworpen om compatibel te zijn met elkaar. Een toepassing die is gebouwd met .NET Framework versie 1.0 moet worden uitgevoerd op versie 1.1 en een toepassing die is gebouwd met .NET Framework versie 1.1 moet worden uitgevoerd op versie 1.0. Houd er echter rekening mee dat API-functies die zijn toegevoegd in versie 1.1 van .NET Framework, niet werken met versie 1.0 van .NET Framework. Toepassingen die zijn gemaakt met versie 2.0, worden alleen uitgevoerd op versie 2.0. Versie 2.0-toepassingen worden niet uitgevoerd op versie 1.1 of eerder.
Versies van .NET Framework worden beschouwd als één eenheid die bestaat uit de runtime en de bijbehorende .NET Framework-assembly's (een concept dat assembly-eenwording wordt genoemd). U kunt assemblybinding omleiden om andere versies van de .NET Framework-assembly's op te nemen, maar het overschrijven van de standaardassemblybinding kan riskant zijn en moet grondig worden getest vóór de implementatie.
Informatie over runtimeversie zoeken
Informatie over de runtimeversie waarmee een toepassing of onderdeel is gecompileerd en met welke versies van de runtime de toepassing moet worden uitgevoerd, worden op twee locaties opgeslagen. Wanneer een toepassing of onderdeel wordt gecompileerd, wordt informatie over de runtimeversie die wordt gebruikt om deze te compileren, opgeslagen in het beheerde uitvoerbare bestand. Informatie over de runtimeversies die de toepassing of het onderdeel vereist, wordt opgeslagen in het configuratiebestand van de toepassing.
Runtime-versiegegevens in het beheerde uitvoerbare bestand
De header van het uitvoerbare uitvoerbare bestand (PE) van elke beheerde toepassing en elk onderdeel bevat informatie over de runtimeversie waarmee deze is gebouwd. De algemene taalruntime gebruikt deze informatie om te bepalen welke versie van de runtime de toepassing moet uitvoeren.
Runtime-versiegegevens in het toepassingsconfiguratiebestand
Naast de informatie in de PE-bestandskoptekst kan een toepassing worden geïmplementeerd met een toepassingsconfiguratiebestand dat informatie over runtimeversies biedt. Het toepassingsconfiguratiebestand is een XML-bestand dat wordt gemaakt door de toepassingsontwikkelaar en die wordt geleverd met een toepassing. Het <vereisteRuntime-element> van de< opstartsectie>, als deze aanwezig is in dit bestand, geeft aan welke versies van de runtime en welke versies van een onderdeel de toepassing ondersteunt. U kunt dit bestand ook gebruiken bij het testen om de compatibiliteit van een toepassing met verschillende versies van de runtime te testen.
Niet-beheerde code, inclusief COM- en COM+-toepassingen, kan toepassingsconfiguratiebestanden bevatten die de runtime gebruikt voor interactie met beheerde code. Het toepassingsconfiguratiebestand is van invloed op alle beheerde code die u activeert via COM. Het bestand kan opgeven welke runtimeversies het ondersteunt, evenals assembly-omleidingen. Standaard gebruiken COM-interoperabiliteitstoepassingen die aanroepen naar beheerde code de nieuwste versie van de runtime die op de computer is geïnstalleerd.
Zie Apps configureren voor meer informatie over de toepassingsconfiguratiebestanden.
Bepalen welke versie van de runtime moet worden geladen
De algemene taalruntime gebruikt de volgende informatie om te bepalen welke versie van de runtime moet worden geladen voor een toepassing:
De runtimeversies die beschikbaar zijn.
De runtimeversies die een toepassing ondersteunt.
Ondersteunde runtimeversies
De runtime maakt gebruik van het toepassingsconfiguratiebestand en de header van het draagbare uitvoerbare bestand (PE) om te bepalen welke versie van de runtime een toepassing ondersteunt. Als er geen toepassingsconfiguratiebestand aanwezig is, laadt de runtime de runtimeversie die is opgegeven in de PE-bestandsheader van de toepassing, als die versie beschikbaar is.
Als er een toepassingsconfiguratiebestand aanwezig is, bepaalt de runtime de juiste runtimeversie die moet worden geladen op basis van de resultaten van het volgende proces:
De runtime onderzoekt het <element supportedRuntime-element> in het configuratiebestand van de toepassing. Als een of meer van de ondersteunde runtimeversies die zijn opgegeven in het element supportedRuntime> aanwezig zijn, laadt de runtime de runtimeversie die is opgegeven door het eerste< ondersteundeRuntime-element>.< Als deze versie niet beschikbaar is, onderzoekt de runtime het volgende <ondersteundeRuntime-element> en probeert de opgegeven runtimeversie te laden. Als deze runtimeversie niet beschikbaar is, worden de volgende <ondersteundeRuntime-elementen> onderzocht. Als geen van de ondersteunde runtimeversies beschikbaar is, kan de runtime geen runtimeversie laden en wordt er een bericht weergegeven aan de gebruiker (zie stap 3).
De runtime leest de PE-bestandsheader van het uitvoerbare bestand van de toepassing. Als de runtimeversie die is opgegeven door de PE-bestandsheader beschikbaar is, laadt de runtime die versie. Als de opgegeven runtimeversie niet beschikbaar is, zoekt de runtime naar een runtimeversie die door Microsoft wordt bepaald om compatibel te zijn met de runtimeversie in de PE-header. Als deze versie niet wordt gevonden, gaat het proces verder met stap 3.
In de runtime wordt een bericht weergegeven waarin wordt aangegeven dat de runtimeversie die wordt ondersteund door de toepassing niet beschikbaar is. De runtime wordt niet geladen.
Notitie
U kunt de weergave van dit bericht onderdrukken met behulp van de NoGuiFromShim-waarde onder de registersleutel HKLM\Software\Microsoft\. NETFramework of met behulp van de omgevingsvariabele COMPLUS_NoGuiFromShim. U kunt bijvoorbeeld het bericht onderdrukken voor toepassingen die doorgaans niet communiceren met de gebruiker, zoals installaties zonder toezicht of Windows-services. Wanneer dit bericht wordt onderdrukt, schrijft de runtime een bericht naar het gebeurtenislogboek. Stel de registerwaarde NoGuiFromShim in op 1 om dit bericht voor alle toepassingen op een computer te onderdrukken. U kunt ook de omgevingsvariabele COMPLUS_NoGuiFromShim instellen op 1 om het bericht te onderdrukken voor toepassingen die in een bepaalde gebruikerscontext worden uitgevoerd.
Notitie
Nadat een runtimeversie is geladen, kunnen assemblybindingsomleidingen opgeven dat een andere versie van een afzonderlijke .NET Framework-assembly wordt geladen. Deze bindingsomleidingen zijn alleen van invloed op de specifieke assembly die wordt omgeleid.
Gedeeltelijk gekwalificeerde assemblynamen en uitvoering naast elkaar
Omdat ze een potentiële bron zijn van naast elkaar geplaatste problemen, kunnen gedeeltelijk gekwalificeerde assemblyverwijzingen alleen worden gebruikt om verbinding te maken met assembly's in een toepassingsmap. Vermijd gedeeltelijk gekwalificeerde assemblyverwijzingen in uw code.
Als u gedeeltelijk gekwalificeerde assemblyverwijzingen in code wilt beperken, kunt u het <element qualifyAssembly> in een toepassingsconfiguratiebestand gebruiken om volledig in aanmerking te komen voor gedeeltelijk gekwalificeerde assemblyverwijzingen die voorkomen in code. Gebruik het <element qualifyAssembly> om alleen velden op te geven die niet zijn ingesteld in de gedeeltelijke verwijzing. De assembly-identiteit die wordt vermeld in het kenmerk fullName , moet alle informatie bevatten die nodig is om de assemblynaam volledig in aanmerking te nemen: assemblynaam, openbare sleutel, cultuur en versie.
In het volgende voorbeeld ziet u de vermelding van het toepassingsconfiguratiebestand om een assembly met de naam myAssembly
volledig in aanmerking te komen.
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<qualifyAssembly partialName="myAssembly"
fullName="myAssembly,
version=1.0.0.0,
publicKeyToken=...,
culture=neutral"/>
</assemblyBinding>
Wanneer een assembly-belastingsinstructie verwijst myAssembly
, zorgen deze configuratiebestandsinstellingen ervoor dat de runtime de gedeeltelijk gekwalificeerde myAssembly
verwijzing automatisch vertaalt naar een volledig gekwalificeerde verwijzing. Assembly.Load("myAssembly") wordt bijvoorbeeld Assembly.Load("myAssembly, version=1.0.0.0, publicKeyToken=..., culture=neutral").
Notitie
U kunt de methode LoadWithPartialName gebruiken om de algemene runtimebeperking voor taal te omzeilen die voorkomt dat gedeeltelijk naar assembly's wordt verwezen vanuit de algemene assemblycache. Deze methode moet alleen worden gebruikt in externe scenario's, omdat dit eenvoudig problemen kan veroorzaken in de uitvoering naast elkaar.
Verwante onderwerpen
Title | Beschrijving |
---|---|
Procedure: Automatische bindingsomleiding in- en uitschakelen | Beschrijft hoe u een toepassing verbindt met een specifieke versie van een assembly. |
Assemblybindingsomleiding configureren | Hierin wordt uitgelegd hoe u assemblybindingsverwijzingen omleidt naar een specifieke versie van de .NET Framework-assembly's. |
Uitvoering naast elkaar | Hierin wordt beschreven hoe u gelijktijdige runtimehostactivering naast elkaar kunt gebruiken om meerdere versies van de CLR in één proces uit te voeren. |
Assembly's in .NET | Biedt een conceptueel overzicht van assembly's. |
Toepassingsdomeinen | Biedt een conceptueel overzicht van toepassingsdomeinen. |