Przekierowywanie wersji zestawu

Odwołania do powiązań czasu kompilacji można przekierować do zestawów programu .NET Framework, zestawów innych firm lub zestawów własnej aplikacji. Możesz przekierować aplikację, aby używać innej wersji zestawu na wiele sposobów: za pomocą zasad wydawcy, za pośrednictwem pliku konfiguracji aplikacji; lub za pośrednictwem pliku konfiguracji maszyny. W tym artykule omówiono sposób działania powiązania zestawu w programie .NET Framework i sposób jej konfigurowania.

Napiwek

Ten artykuł jest specyficzny dla aplikacji .NET Framework. Aby uzyskać informacje na temat ładowania zestawów na platformie .NET 5+ (i .NET Core), zobacz Ładowanie zależności na platformie .NET.

Zjednoczenie zestawu i powiązanie domyślne

Powiązania z zestawami programu .NET Framework są czasami przekierowywane za pośrednictwem procesu nazywanego zjednoczeniem zestawów. Program .NET Framework składa się z wersji środowiska uruchomieniowego języka wspólnego i około dwóch tuzinów zestawów .NET Framework tworzących bibliotekę typów. Te zestawy programu .NET Framework są traktowane przez środowisko uruchomieniowe jako pojedynczą jednostkę. Domyślnie po uruchomieniu aplikacji wszystkie odwołania do typów w kodzie uruchamianym przez środowisko uruchomieniowe są kierowane do zestawów programu .NET Framework, które mają ten sam numer wersji co środowisko uruchomieniowe załadowane w procesie. Przekierowania występujące w tym modelu są domyślnym zachowaniem środowiska uruchomieniowego.

Jeśli na przykład aplikacja odwołuje się do typów w przestrzeni nazw System.XML i została skompilowana przy użyciu programu .NET Framework 4.5, zawiera statyczne odwołania do zestawu System.XML dostarczanego ze środowiskiem uruchomieniowym w wersji 4.5. Jeśli chcesz przekierować odwołanie do powiązania, aby wskazać zestaw System.XML dostarczony za pomocą programu .NET Framework 4, możesz umieścić informacje przekierowania w pliku konfiguracji aplikacji. Przekierowanie powiązania w pliku konfiguracji dla ujednoliconego zestawu .NET Framework anuluje zjednoczenie tego zestawu.

Ponadto można ręcznie przekierować powiązanie zestawu dla zestawów innych firm, jeśli istnieje wiele dostępnych wersji.

Przekierowywanie wersji przy użyciu zasad wydawcy

Dostawcy zestawów mogą kierować aplikacje do nowszej wersji zestawu, dołączając plik zasad wydawcy do nowego zestawu. Plik zasad wydawcy, który znajduje się w globalnej pamięci podręcznej zestawów, zawiera ustawienia przekierowania zestawu.

Każda główna.Wersja pomocnicza zestawu ma własny plik zasad wydawcy. Na przykład przekierowania z wersji 2.0.2.222 do wersji 2.0.3.000 i z wersji 2.0.2.321 do wersji 2.0.3.000 przechodzą do tego samego pliku, ponieważ są one skojarzone z wersją 2.0. Jednak przekierowanie z wersji 3.0.0.999 do wersji 4.0.0.000 przechodzi do pliku w wersji 3.0.999. Każda główna wersja programu .NET Framework ma własny plik zasad wydawcy.

Jeśli plik zasad wydawcy istnieje dla zestawu, środowisko uruchomieniowe sprawdza ten plik po sprawdzeniu manifestu zestawu i pliku konfiguracji aplikacji. Dostawcy powinni używać plików zasad wydawcy tylko wtedy, gdy nowy zestaw jest do tyłu zgodny z przekierowywanym zestawem.

Zasady wydawcy dla aplikacji można pominąć, określając ustawienia w pliku konfiguracji aplikacji, zgodnie z opisem w sekcji Pomijanie zasad wydawcy.

Przekierowywanie wersji na poziomie aplikacji

Istnieje kilka różnych technik zmiany zachowania powiązania aplikacji za pomocą pliku konfiguracji aplikacji: można ręcznie edytować plik, można polegać na automatycznym przekierowywaniu powiązań lub określić zachowanie powiązania, pomijając zasady wydawcy.

Ręczne edytowanie pliku konfiguracji aplikacji

Możesz ręcznie edytować plik konfiguracji aplikacji, aby rozwiązać problemy z zestawem. Jeśli na przykład dostawca może zwolnić nowszą wersję zestawu używanego przez aplikację bez podawania zasad wydawcy, ponieważ nie gwarantują zgodności z poprzednimi wersjami, możesz skierować aplikację do korzystania z nowszej wersji zestawu, umieszczając informacje o powiązaniu zestawu w pliku konfiguracji aplikacji w następujący sposób.

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

Polegaj na automatycznym przekierowywaniu powiązań

Podczas tworzenia aplikacji klasycznej w programie Visual Studio, która jest przeznaczona dla programu .NET Framework 4.5.1 lub nowszej wersji, aplikacja używa automatycznego przekierowywania powiązań. Oznacza to, że jeśli dwa składniki odwołują się do różnych wersji tego samego zestawu o silnych nazwach, środowisko uruchomieniowe automatycznie dodaje przekierowanie powiązania do nowszej wersji zestawu w pliku konfiguracji aplikacji wyjściowej (app.config). To przekierowanie zastępuje zjednoczenie zestawu, które może mieć miejsce w przeciwnym razie. Źródłowy plik app.config nie jest modyfikowany. Załóżmy na przykład, że aplikacja odwołuje się bezpośrednio do składnika .NET Framework poza pasmem, ale używa biblioteki innej firmy, która jest przeznaczona dla starszej wersji tego samego składnika. Podczas kompilowania aplikacji plik konfiguracji aplikacji wyjściowej jest modyfikowany tak, aby zawierał przekierowanie powiązania do nowszej wersji składnika. Jeśli tworzysz aplikację internetową, zostanie wyświetlone ostrzeżenie kompilacji dotyczące konfliktu powiązań, co z kolei daje możliwość dodania niezbędnego przekierowania powiązania do źródłowego pliku konfiguracji sieci Web.

Jeśli ręcznie dodasz przekierowania powiązania do źródłowego pliku app.config, w czasie kompilacji program Visual Studio podejmie próbę ujednolicenia zestawów na podstawie dodanych przekierowań powiązań. Załóżmy na przykład, że wstawisz następujące przekierowanie powiązania dla zestawu:

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

Jeśli inny projekt w aplikacji odwołuje się do wersji 1.0.0.0 tego samego zestawu, automatyczne przekierowywanie powiązań dodaje następujący wpis do pliku wyjściowego app.config, aby aplikacja została ujednolicona w wersji 2.0.0.0 tego zestawu:

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

Możesz włączyć automatyczne przekierowywanie powiązań, jeśli aplikacja jest przeznaczona dla starszych wersji programu .NET Framework. To domyślne zachowanie można zastąpić, podając informacje przekierowania powiązania w pliku app.config dla dowolnego zestawu lub wyłączając funkcję przekierowania powiązania. Aby uzyskać informacje na temat włączania lub wyłączania tej funkcji, zobacz Jak włączyć i wyłączyć automatyczne przekierowywanie powiązań.

Obejście zasad wydawcy

W razie potrzeby można zastąpić zasady wydawcy w pliku konfiguracji aplikacji. Na przykład nowe wersje zestawów, które twierdzą, że są zgodne z poprzednimi wersjami, nadal mogą uszkodzić aplikację. Jeśli chcesz pominąć zasady wydawcy, dodaj element publisherPolicy> do< elementu dependentAssembly> w pliku konfiguracji aplikacji i ustaw atrybut apply na nie, co zastępuje wszystkie poprzednie ustawienia tak.<

<publisherPolicy apply="no" />

Pomiń zasady wydawcy, aby zachować działanie aplikacji dla użytkowników, ale upewnij się, że zgłosisz problem dostawcy zestawu. Jeśli zestaw zawiera plik zasad wydawcy, dostawca powinien upewnić się, że zestaw jest zgodny z poprzednimi wersjami i że klienci mogą korzystać z nowej wersji tak bardzo, jak to możliwe.

Przekierowywanie wersji na poziomie komputera

Mogą wystąpić rzadkie przypadki, gdy administrator komputera chce, aby wszystkie aplikacje na komputerze używały określonej wersji zestawu. Na przykład określona wersja może naprawić dziurę zabezpieczeń. Jeśli zestaw jest przekierowywany w pliku konfiguracji maszyny o nazwie machine.config, wszystkie aplikacje na tym komputerze, które używają starej wersji, są kierowane do korzystania z nowej wersji. Plik konfiguracji maszyny zastępuje plik konfiguracji aplikacji i plik zasad wydawcy. Ten plik machine.config znajduje się w folderze %windir%\Microsoft.NET\Framework[version]\config\machine.config dla maszyn 32-bitowych lub %windir%\Microsoft.NET\Framework64[wersja]\config\machine.config dla maszyn 64-bitowych.

Określanie powiązania zestawu w plikach konfiguracji

Ten sam format XML służy do określania przekierowań powiązań, niezależnie od tego, czy znajduje się w pliku konfiguracji aplikacji, pliku konfiguracji komputera, czy pliku zasad wydawcy. Aby przekierować jedną wersję zestawu do innej, użyj elementu bindingRedirect>.< Atrybut oldVersion może określać jedną wersję zestawu lub zakres wersji. Atrybut newVersion powinien określać jedną wersję. Na przykład określa, <bindingRedirect oldVersion="1.1.0.0-1.2.0.0" newVersion="2.0.0.0"/> że środowisko uruchomieniowe powinno używać wersji 2.0.0.0 zamiast wersji zestawu z zakresu od 1.1.0.0 do 1.2.0.0.

Poniższy przykład kodu przedstawia różne scenariusze przekierowania powiązań. W tym przykładzie określono przekierowanie dla zakresu wersji programu myAssemblyi pojedynczego przekierowania powiązania dla elementu mySecondAssembly. W przykładzie określono również, że plik zasad wydawcy nie zastąpi przekierowań powiązań dla elementu myThirdAssembly.

Aby powiązać zestaw, należy określić ciąg "urn:schemas-microsoft-com:asm.v1" za pomocą atrybutu xmlns w tagu <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>

Ograniczanie powiązań zestawów do określonej wersji

Możesz użyć atrybutu appliesTo w <elemencie assemblyBinding> w pliku konfiguracji aplikacji, aby przekierować odwołania powiązania zestawu do określonej wersji programu .NET Framework. Ten opcjonalny atrybut używa numeru wersji programu .NET Framework, aby wskazać, której wersji dotyczy. Jeśli nie określono atrybutu appliesTo , <element assemblyBinding> ma zastosowanie do wszystkich wersji programu .NET Framework.

Aby na przykład przekierować powiązanie zestawu dla zestawu .NET Framework 3.5, należy dołączyć następujący kod XML w pliku konfiguracji aplikacji.

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

Należy wprowadzić informacje o przekierowaniu w kolejności wersji. Na przykład wprowadź informacje o przekierowaniu powiązania zestawu dla zestawów programu .NET Framework 3.5, a następnie zestawy programu .NET Framework 4.5. Na koniec wprowadź informacje przekierowania powiązania zestawu dla dowolnego przekierowania zestawu .NET Framework, które nie używa atrybutu appliesTo , a w związku z tym dotyczy wszystkich wersji programu .NET Framework. Jeśli występuje konflikt podczas przekierowywania, zostanie użyta pierwsza zgodna instrukcja przekierowania w pliku konfiguracji.

Aby na przykład przekierować jedno odwołanie do zestawu .NET Framework 3.5 i inne odwołanie do zestawu .NET Framework 4, użyj wzorca pokazanego w poniższym pseudokodzie.

<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>

Zobacz też