Dela via


Omdirigera sammansättningsversioner

Kommentar

Den här artikeln är specifik för .NET Framework. Det gäller inte för nyare implementeringar av .NET, inklusive .NET 6 och senare versioner.

Du kan omdirigera kompileringsbindningsreferenser till .NET Framework-sammansättningar, tredjepartssammansättningar eller din egen apps sammansättningar. Du kan omdirigera din app till att använda en annan version av en sammansättning på flera olika sätt: via utgivarens princip, via en appkonfigurationsfil; eller via datorns konfigurationsfil. Den här artikeln beskriver hur sammansättningsbindning fungerar i .NET Framework och hur den kan konfigureras.

Dricks

Den här artikeln är specifik för .NET Framework-appar. Information om sammansättningsinläsning i .NET 5+ (och .NET Core) finns i Beroendeinläsning i .NET.

Sammansättningssammanslagning och standardbindning

Bindningar till .NET Framework-sammansättningar omdirigeras ibland via en process som kallas sammansättningssammanslagning. .NET Framework består av en version av den gemensamma språkkörningen och cirka två dussin .NET Framework-sammansättningar som utgör typbiblioteket. Dessa .NET Framework-sammansättningar behandlas av körningen som en enda enhet. När en app startas dirigeras som standard alla referenser till typer i kod som körs av körningen till .NET Framework-sammansättningar som har samma versionsnummer som körningen som läses in i en process. Omdirigeringarna som sker med den här modellen är standardbeteendet för körningen.

Om din app till exempel refererar till typer i System.XML namnområdet och skapades med hjälp av .NET Framework 4.5 innehåller den statiska referenser till den System.XML sammansättning som levereras med körningsversion 4.5. Om du vill omdirigera bindningsreferensen så att den pekar på den System.XML sammansättning som levereras med .NET Framework 4 kan du placera omdirigeringsinformation i appkonfigurationsfilen. En bindningsomdirigering i en konfigurationsfil för en enhetlig .NET Framework-sammansättning avbryter sammansättningens enande.

Dessutom kanske du vill omdirigera sammansättningsbindningen manuellt för sammansättningar från tredje part om det finns flera tillgängliga versioner.

Omdirigeringsversioner med hjälp av utgivarprincip

Leverantörer av sammansättningar kan dirigera appar till en nyare version av en sammansättning genom att inkludera en utgivarprincipfil med den nya sammansättningen. Utgivarprincipfilen, som finns i den globala sammansättningscacheminnet, innehåller inställningar för omdirigering av sammansättning.

Varje major.en delversion av en sammansättning har en egen principfil för utgivare. Omdirigeringar från version 2.0.2.222 till 2.0.3.000 och från version 2.0.2.321 till version 2.0.3.000 går båda till samma fil eftersom de är associerade med version 2.0. En omdirigering från version 3.0.0.999 till version 4.0.0.000 hamnar dock i filen för version 3.0.999. Varje huvudversion av .NET Framework har en egen principfil för utgivare.

Om det finns en utgivarprincipfil för en sammansättning kontrollerar körningen den här filen efter att ha kontrollerat sammansättningens manifest- och appkonfigurationsfil. Leverantörer bör endast använda utgivarprincipfiler när den nya sammansättningen är bakåtkompatibel med sammansättningen som omdirigeras.

Du kan kringgå utgivarprincipen för din app genom att ange inställningar i appkonfigurationsfilen, enligt beskrivningen i avsnittet Kringgå utgivarprincip.

Omdirigeringsversioner på appnivå

Det finns några olika metoder för att ändra bindningsbeteendet för din app via appkonfigurationsfilen: du kan redigera filen manuellt, du kan förlita dig på automatisk bindningsomdirigering eller ange bindningsbeteende genom att kringgå utgivarens princip.

Redigera appkonfigurationsfilen manuellt

Du kan redigera appkonfigurationsfilen manuellt för att lösa sammansättningsproblem. Om en leverantör till exempel kan släppa en nyare version av en sammansättning som appen använder utan att ange en utgivarprincip, eftersom de inte garanterar bakåtkompatibilitet, kan du dirigera din app att använda den nyare versionen av sammansättningen genom att placera information om sammansättningsbindning i appens konfigurationsfil på följande sätt.

<dependentAssembly>
  <assemblyIdentity name="someAssembly"
    publicKeyToken="32ab4ba45e0a69a1"
    culture="en-us" />
  <bindingRedirect oldVersion="7.0.0.0" newVersion="8.0.0.0" />
</dependentAssembly>

Förlita dig på automatisk omdirigering av bindning

När du skapar en skrivbordsapp i Visual Studio som är avsedd för .NET Framework 4.5.1 eller senare använder appen automatisk omdirigering av bindningar. Det innebär att om två komponenter refererar till olika versioner av samma starka namngivna sammansättning lägger körningen automatiskt till en bindningsomdirigering till den nyare versionen av sammansättningen i utdataappens konfigurationsfil (app.config). Den här omdirigeringen åsidosätter den sammansättningssammanslagning som annars skulle kunna äga rum. Källfilen app.config har inte ändrats. Anta till exempel att din app direkt refererar till en out-of-band .NET Framework-komponent men använder ett bibliotek från tredje part som riktar sig till en äldre version av samma komponent. När du kompilerar appen ändras konfigurationsfilen för utdataappen så att den innehåller en bindningsomdirigering till den nyare versionen av komponenten. Om du skapar en webbapp får du en byggvarning om bindningskonflikten, vilket i sin tur ger dig möjlighet att lägga till den nödvändiga bindningsomdirigeringen till källwebbkonfigurationsfilen.

Om du lägger till bindningsomdirigeringar manuellt till källfilen app.config försöker Visual Studio vid kompileringstillfället att förena sammansättningarna baserat på de bindningsomdirigeringar som du har lagt till. Anta till exempel att du infogar följande bindningsomdirigering för en sammansättning:

<bindingRedirect oldVersion="3.0.0.0" newVersion="2.0.0.0" />

Om ett annat projekt i appen refererar till version 1.0.0.0 av samma sammansättning lägger automatisk bindningsomdirigering till följande post i utdataappen.config-filen så att appen är enhetlig på version 2.0.0.0 av den här sammansättningen:

<bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0" />

Du kan aktivera automatisk omdirigering av bindning om din app riktar sig mot äldre versioner av .NET Framework. Du kan åsidosätta det här standardbeteendet genom att ange information om bindningsomdirigering i app.config-filen för alla sammansättningar eller genom att stänga av funktionen för bindningsomdirigering. Information om hur du aktiverar eller inaktiverar den här funktionen finns i Så här aktiverar och inaktiverar du automatisk omdirigering av bindning.

Kringgå utgivarprincip

Du kan åsidosätta utgivarprincipen i appkonfigurationsfilen om det behövs. Till exempel kan nya versioner av sammansättningar som påstår sig vara bakåtkompatibla fortfarande bryta en app. Om du vill kringgå utgivarprincipen lägger du till ett publisherPolicy-element> i det< beroendeAssembly-elementet> i appkonfigurationsfilen och anger tillämpat attribut till nej, vilket åsidosätter tidigare ja-inställningar.<

<publisherPolicy apply="no" />

Kringgå utgivarens princip för att hålla appen igång för användarna, men se till att du rapporterar problemet till sammansättningsleverantören. Om en sammansättning har en utgivarprincipfil bör leverantören se till att sammansättningen är bakåtkompatibel och att klienterna kan använda den nya versionen så mycket som möjligt.

Omdirigeringsversioner på datornivå

Det kan finnas sällsynta fall när en datoradministratör vill att alla appar på en dator ska använda en viss version av en sammansättning. En specifik version kan till exempel åtgärda ett säkerhetshål. Om en sammansättning omdirigeras i datorns konfigurationsfil, som kallas machine.config, dirigeras alla appar på den datorn som använder den gamla versionen till att använda den nya versionen. Datorkonfigurationsfilen åsidosätter appkonfigurationsfilen och utgivarens principfil. Den här filen machine.config finns på %windir%\Microsoft.NET\Framework[version]\config\machine.config för 32-bitars datorer eller %windir%\Microsoft.NET\Framework64[version]\config\machine.config för 64-bitars datorer.

Ange sammansättningsbindning i konfigurationsfiler

Du använder samma XML-format för att ange bindningsomdirigeringar oavsett om det finns i appkonfigurationsfilen, datorkonfigurationsfilen eller utgivarens principfil. Om du vill omdirigera en sammansättningsversion till en annan använder du elementet <bindingRedirect> . Attributet oldVersion kan ange en enskild sammansättningsversion eller ett intervall med versioner. Attributet newVersion ska ange en enskild version. Anger till exempel <bindingRedirect oldVersion="1.1.0.0-1.2.0.0" newVersion="2.0.0.0"/> att körningen ska använda version 2.0.0.0 i stället för sammansättningsversionerna mellan 1.1.0.0 och 1.2.0.0.

I följande kodexempel visas en mängd olika scenarier för bindningsomdirigering. Exemplet anger en omdirigering för ett intervall med versioner för myAssembly, och en enda bindningsomdirigering för mySecondAssembly. Exemplet anger också att utgivarprincipfilen inte åsidosätter bindningsomdirigeringarna för myThirdAssembly.

Om du vill binda en sammansättning måste du ange strängen "urn:schemas-microsoft-com:asm.v1" med xmlns-attributet i taggen< assemblyBinding>.

<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="myAssembly"
          publicKeyToken="32ab4ba45e0a69a1"
          culture="en-us" />
        <!-- Assembly versions can be redirected in app,
          publisher policy, or machine configuration files. -->
        <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="3.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="mySecondAssembly"
          publicKeyToken="32ab4ba45e0a69a1"
          culture="en-us" />
             <bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
      <assemblyIdentity name="myThirdAssembly"
        publicKeyToken="32ab4ba45e0a69a1"
        culture="en-us" />
        <!-- Publisher policy can be set only in the app
          configuration file. -->
        <publisherPolicy apply="no" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

Begränsa sammansättningsbindningar till en viss version

Du kan använda attributet appliesTo<assemblyBinding-elementet> i en appkonfigurationsfil för att omdirigera sammansättningsbindningsreferenser till en specifik version av .NET Framework. Det här valfria attributet använder ett .NET Framework-versionsnummer för att ange vilken version det gäller för. Om inget appliesTo-attribut anges <gäller assemblyBinding-elementet> för alla versioner av .NET Framework.

Om du till exempel vill omdirigera sammansättningsbindning för en .NET Framework 3.5-sammansättning skulle du inkludera följande XML-kod i appkonfigurationsfilen.

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"
    appliesTo="v3.5">
    <dependentAssembly>
      <!-- assembly information goes here -->
    </dependentAssembly>
  </assemblyBinding>
</runtime>

Du bör ange omdirigeringsinformation i versionsordning. Ange till exempel information om omdirigering av sammansättningsbindningar för .NET Framework 3.5-sammansättningar följt av .NET Framework 4.5-sammansättningar. Ange slutligen information om omdirigering av sammansättningsbindning för alla .NET Framework-sammansättningsomdirigeringar som inte använder attributet appliesTo och som därför gäller för alla versioner av .NET Framework. Om en omdirigeringskonflikt uppstår används den första matchande omdirigeringsinstruktionen i konfigurationsfilen.

Om du till exempel vill omdirigera en referens till en .NET Framework 3.5-sammansättning och en annan referens till en .NET Framework 4-sammansättning använder du mönstret som visas i följande pseudokod.

<assemblyBinding xmlns="..." appliesTo="v3.5 ">
  <!--.NET Framework version 3.5 redirects here -->
</assemblyBinding>

<assemblyBinding xmlns="..." appliesTo="v4.0.30319">
  <!--.NET Framework version 4.0 redirects here -->
</assemblyBinding>

<assemblyBinding xmlns="...">
  <!-- redirects meant for all versions of the runtime -->
</assemblyBinding>

Se även