Derleme sürümlerini yeniden yönlendirme

Derleme zamanı bağlama başvurularını .NET Framework derlemelerine, üçüncü taraf derlemelerine veya kendi uygulamanızın derlemelerine yeniden yönlendirebilirsiniz. Uygulamanızı bir derlemenin farklı bir sürümünü kullanmak için çeşitli yollarla yönlendirebilirsiniz: yayımcı ilkesi aracılığıyla, uygulama yapılandırma dosyası aracılığıyla; veya makine yapılandırma dosyası aracılığıyla. Bu makalede derleme bağlamanın .NET Framework'te nasıl çalıştığı ve nasıl yapılandırılacağı açıklanmaktadır.

İpucu

Bu makale .NET Framework uygulamalarına özgüdür. .NET 5+ (ve .NET Core) içinde derleme yükleme hakkında bilgi için bkz . .NET'te bağımlılık yükleme.

Derleme birleştirme ve varsayılan bağlama

.NET Framework derlemelerine yönelik bağlamalar bazen derleme birleştirme adı verilen bir işlem aracılığıyla yeniden yönlendirilir. .NET Framework, ortak dil çalışma zamanının bir sürümünden ve tür kitaplığını oluşturan yaklaşık iki düzine .NET Framework derlemelerinden oluşur. Bu .NET Framework derlemeleri çalışma zamanı tarafından tek bir birim olarak değerlendirilir. Varsayılan olarak, bir uygulama başlatıldığında, çalışma zamanı tarafından çalıştırılan koddaki türlere yapılan tüm başvurular, bir işlemde yüklenen çalışma zamanıyla aynı sürüm numarasına sahip .NET Framework derlemelerine yönlendirilir. Bu modelde gerçekleşen yeniden yönlendirmeler çalışma zamanı için varsayılan davranıştır.

Örneğin, uygulamanız System.XML ad alanında türlere başvurursa ve .NET Framework 4.5 kullanılarak oluşturulduysa, çalışma zamanı sürümü 4.5 ile birlikte gelen System.XML derlemesine statik başvurular içerir. Bağlama başvuruyu .NET Framework 4 ile birlikte gelen System.XML derlemesine yönlendirmek istiyorsanız, yeniden yönlendirme bilgilerini uygulama yapılandırma dosyasına yerleştirebilirsiniz. Birleşik bir .NET Framework derlemesi için yapılandırma dosyasındaki bağlama yeniden yönlendirmesi, bu derlemenin birleştirilmesini iptal eder.

Ayrıca, birden çok sürüm varsa üçüncü taraf derlemeler için derleme bağlamasını el ile yeniden yönlendirmek isteyebilirsiniz.

Yayımcı ilkesini kullanarak sürümleri yeniden yönlendirme

Derleme satıcıları, yeni derlemeye yayımcı ilke dosyası ekleyerek uygulamaları derlemenin daha yeni bir sürümüne yönlendirebilir. Genel derleme önbelleğinde bulunan yayımcı ilkesi dosyası, derleme yeniden yönlendirme ayarlarını içerir.

Her ana branş.bir derlemenin ikincil sürümünün kendi yayımcı ilkesi dosyası vardır. Örneğin, sürüm 2.0.2.222'den 2.0.3.000'e ve sürüm 2.0.2.321'den sürüm 2.0.3.000'e yeniden yönlendirmeler aynı dosyaya gider, çünkü bunlar sürüm 2.0 ile ilişkilidir. Ancak, sürüm 3.0.0.999'dan sürüm 4.0.0.000'e yeniden yönlendirme, 3.0.999 sürümü için dosyaya gider. .NET Framework'ün her ana sürümünün kendi yayımcı ilkesi dosyası vardır.

Derleme için yayımcı ilkesi dosyası varsa, çalışma zamanı derlemenin bildirimini ve uygulama yapılandırma dosyasını denetledikten sonra bu dosyayı denetler. Satıcılar yayımcı ilkesi dosyalarını yalnızca yeni derleme yeniden yönlendirilen derlemeyle geriye dönük uyumlu olduğunda kullanmalıdır.

Yayımcı ilkesini atlama bölümünde açıklandığı gibi, uygulama yapılandırma dosyasında ayarları belirterek uygulamanız için yayımcı ilkesini atlayabilirsiniz.

Sürümleri uygulama düzeyinde yeniden yönlendirme

Uygulama yapılandırma dosyası aracılığıyla uygulamanız için bağlama davranışını değiştirmek için birkaç farklı teknik vardır: dosyayı el ile düzenleyebilir, otomatik bağlama yeniden yönlendirmesine güvenebilir veya yayımcı ilkesini atlayarak bağlama davranışını belirtebilirsiniz.

Uygulama yapılandırma dosyasını el ile düzenleme

Derleme sorunlarını çözmek için uygulama yapılandırma dosyasını el ile düzenleyebilirsiniz. Örneğin, bir satıcı uygulamanızın yayımcı ilkesi sağlamadan kullandığı derlemenin daha yeni bir sürümünü yayınlayabilirse, geriye dönük uyumluluğu garanti etmediğinden, uygulamanızı derleme bağlama bilgilerini uygulamanızın yapılandırma dosyasına aşağıdaki gibi koyarak derlemenin daha yeni sürümünü kullanmaya yönlendirebilirsiniz.

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

Otomatik bağlama yeniden yönlendirmesine güvenme

Visual Studio'da .NET Framework 4.5.1 veya sonraki bir sürümü hedefleyen bir masaüstü uygulaması oluşturduğunuzda, uygulama otomatik bağlama yeniden yönlendirmesini kullanır. Başka bir deyişle, iki bileşen aynı tanımlayıcı adlandırılmış derlemenin farklı sürümlerine başvuruyorsa, çalışma zamanı otomatik olarak çıkış uygulaması yapılandırması (app.config) dosyasında derlemenin daha yeni sürümüne bağlama yeniden yönlendirmesi ekler. Bu yeniden yönlendirme, aksi takdirde gerçekleşebilecek derleme birleştirmeyi geçersiz kılar. Kaynak app.config dosyası değiştirilmez. Örneğin, uygulamanızın bant dışı bir .NET Framework bileşenine doğrudan başvurduğunu ancak aynı bileşenin eski bir sürümünü hedefleyen bir üçüncü taraf kitaplığı kullandığını düşünelim. Uygulamayı derlediğinizde, çıkış uygulaması yapılandırma dosyası bileşenin daha yeni sürümüne bağlama yeniden yönlendirmesi içerecek şekilde değiştirilir. Bir web uygulaması oluşturursanız, bağlama çakışması ile ilgili bir derleme uyarısı alırsınız ve bu da size kaynak web yapılandırma dosyasına gerekli bağlama yeniden yönlendirmesini ekleme seçeneği sunar.

Bağlama yeniden yönlendirmelerini source app.config dosyasına el ile eklerseniz, Derleme zamanında Visual Studio, eklediğiniz bağlama yeniden yönlendirmelerine göre derlemeleri birleştirmeye çalışır. Örneğin, bir derleme için aşağıdaki bağlama yeniden yönlendirmesini eklediğinizi varsayalım:

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

Uygulamanızdaki başka bir proje aynı derlemenin 1.0.0.0 sürümüne başvuruyorsa, otomatik bağlama yeniden yönlendirmesi aşağıdaki girişi output app.config dosyasına ekler, böylece uygulama bu derlemenin 2.0.0.0 sürümünde birleştirilir:

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

Uygulamanız .NET Framework'ün eski sürümlerini hedeflerse otomatik bağlama yeniden yönlendirmesini etkinleştirebilirsiniz. Herhangi bir derleme için app.config dosyasında bağlama yeniden yönlendirme bilgileri sağlayarak veya bağlama yeniden yönlendirme özelliğini kapatarak bu varsayılan davranışı geçersiz kılabilirsiniz. Bu özelliği açma veya kapatma hakkında bilgi için bkz . Nasıl yapılır: Otomatik Bağlama Yeniden Yönlendirmesini Etkinleştirme ve Devre Dışı Bırakma.

Yayımcı ilkesini atlama

Gerekirse uygulama yapılandırma dosyasında yayımcı ilkesini geçersiz kılabilirsiniz. Örneğin, geriye dönük uyumlu olduğunu iddia eden derlemelerin yeni sürümleri yine de bir uygulamayı bozabilir. Yayımcı ilkesini atlamak istiyorsanız, uygulama yapılandırma dosyasındaki dependentAssembly> öğesine bir <publisherPolicy> öğesi ekleyin ve önceki evet ayarlarını geçersiz kılan apply özniteliğini hayır olarak ayarlayın.<

<publisherPolicy apply="no" />

Uygulamanızı kullanıcılarınız için çalışır durumda tutmak için yayımcı ilkesini atla, ancak sorunu derleme satıcısına bildirdiğinizden emin olun. Bir derlemenin yayımcı ilkesi dosyası varsa, satıcı derlemenin geriye dönük olarak uyumlu olduğundan ve istemcilerin yeni sürümü mümkün olduğunca kullanabileceğinden emin olmalıdır.

Sürümleri makine düzeyinde yeniden yönlendirme

Bir makine yöneticisinin bilgisayardaki tüm uygulamaların bir derlemenin belirli bir sürümünü kullanmasını istediği nadir durumlar olabilir. Örneğin, belirli bir sürüm bir güvenlik deliğini düzeltebilir. Makinenin machine.config adlı yapılandırma dosyasında bir derleme yeniden yönlendirilirse, bu makinedeki eski sürümü kullanan tüm uygulamalar yeni sürümü kullanmaya yönlendirilir. Makine yapılandırma dosyası, uygulama yapılandırma dosyasını ve yayımcı ilkesi dosyasını geçersiz kılar. Bu machine.config dosyası 32 bit makineler için %windir%\Microsoft.NET\Framework[version]\config\machine.config konumunda veya 64 bit makineler için %windir%\Microsoft.NET\Framework64[version]\config\machine.config konumunda bulunur.

Yapılandırma dosyalarında derleme bağlaması belirtme

Uygulama yapılandırma dosyasında, makine yapılandırma dosyasında veya yayımcı ilkesi dosyasında yer alan bağlama yeniden yönlendirmelerini belirtmek için aynı XML biçimini kullanırsınız. Bir derleme sürümünü başka bir derlemeye yeniden yönlendirmek için bindingRedirect öğesini kullanın<.> oldVersion özniteliği tek bir derleme sürümü veya bir sürüm aralığı belirtebilir. özniteliği tek newVersion bir sürüm belirtmelidir. Örneğin, <bindingRedirect oldVersion="1.1.0.0-1.2.0.0" newVersion="2.0.0.0"/> çalışma zamanının 1.1.0.0 ile 1.2.0.0 arasındaki derleme sürümleri yerine 2.0.0.0 sürümünü kullanması gerektiğini belirtir.

Aşağıdaki kod örneği çeşitli bağlama yeniden yönlendirme senaryolarını gösterir. Örnek, için bir sürüm aralığı için bir yeniden yönlendirme ve için myAssemblymySecondAssemblytek bir bağlama yeniden yönlendirmesi belirtir. Örnek ayrıca yayımcı ilkesi dosyasının için myThirdAssemblybağlama yeniden yönlendirmelerini geçersiz kılmayacağını belirtir.

Bir derlemeyi bağlamak için assemblyBinding etiketinde xmlns özniteliğiyle "urn:schemas-microsoft-com:asm.v1" dizesini <belirtmeniz gerekir.>

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

Derleme bağlamalarını belirli bir sürümle sınırlama

Derleme bağlama başvurularını .NET Framework'ün belirli bir sürümüne yeniden yönlendirmek için bir uygulama yapılandırma dosyasındaki assemblyBinding> öğesinde appliesTo özniteliğini kullanabilirsiniz.< Bu isteğe bağlı öznitelik, hangi sürüm için geçerli olduğunu belirtmek için bir .NET Framework sürüm numarası kullanır. hiçbir appliesTo özniteliği belirtilmezse,< assemblyBinding> öğesi .NET Framework'ün tüm sürümlerine uygulanır.

Örneğin, .NET Framework 3.5 derlemesi için derleme bağlamasını yeniden yönlendirmek için, uygulama yapılandırma dosyanıza aşağıdaki XML kodunu eklersiniz.

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

Yeniden yönlendirme bilgilerini sürüm sırasına girmelisiniz. Örneğin, .NET Framework 3.5 derlemeleri için derleme bağlama yeniden yönlendirme bilgilerini ve ardından .NET Framework 4.5 derlemelerini girin. Son olarak, appliesTo özniteliğini kullanmayan ve bu nedenle .NET Framework'ün tüm sürümleri için geçerli olan herhangi bir .NET Framework derleme yeniden yönlendirmesi için derleme bağlama yeniden yönlendirme bilgilerini girin. Yeniden yönlendirmede çakışma varsa, yapılandırma dosyasındaki ilk eşleşen yeniden yönlendirme deyimi kullanılır.

Örneğin, bir başvuruyu .NET Framework 3.5 derlemesine ve başka bir başvuruyu .NET Framework 4 derlemesine yeniden yönlendirmek için aşağıdaki sahte kodda gösterilen deseni kullanın.

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

Ayrıca bkz.