Derleme sürümlerini yeniden yönlendirme

derleme zamanı bağlama başvurularını .NET Framework derlemelere, üçüncü taraf derlemelerine veya kendi uygulamanızın derlemelerinize yeniden yönlendirebilirsiniz. Uygulamanızı çeşitli yollarla bir derlemenin farklı bir sürümünü kullanacak şekilde yeniden 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ğlamasının .NET Framework ' de nasıl çalıştığı ve nasıl yapılandırılabileceği açıklanmaktadır.

İpucu

bu makale .NET Framework uygulamalarına özeldir. .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şme ve varsayılan bağlama

.NET Framework derlemelerine bağlamalar bazen derleme birleşme adlı 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 iki düzine .NET Framework bütünleştirilmiş kod ile 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 derlemelere yönlendirilir. Bu modelde gerçekleşen yeniden yönlendirmeler, çalışma zamanının varsayılan davranışıdır.

örneğin, uygulamanız System.XML ad alanındaki türlere başvuruyorsa 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şvurusunu .NET Framework 4 ile birlikte gelen System.XML derlemesine işaret etmek istiyorsanız, yeniden yönlendirme bilgilerini uygulama yapılandırma dosyasına yerleştirebilirsiniz. birleştirilmiş bir .NET Framework derlemesi için yapılandırma dosyasında bir bağlama yeniden yönlendirmesi, bu derleme için birleşme işlemini iptal eder.

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

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

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

Her önemli. bir derlemenin İkincil sürümünün kendi yayımcı ilkesi dosyası vardır. Örneğin, sürüm 2,0 ile ilişkili olduklarından, 2.0.2.222 sürümünden 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. Ancak, sürüm 3.0.0.999 'den sürüm 4.0.0.000 'e yeniden yönlendirme, sürüm 3.0.999 için dosyaya gider. .NET Framework her ana sürümünün kendi yayımcı ilkesi dosyası vardır.

Bir derleme için yayımcı ilke dosyası varsa, çalışma zamanı derlemenin bildirimini ve uygulama yapılandırma dosyasını denetledikten sonra bu dosyayı denetler. Satıcıların Yayımcı ilke dosyalarını yalnızca yeni derleme yeniden yönlendirilmekte olan derleme ile geriye dönük olarak uyumlu olduğunda kullanması gerekir.

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

Uygulama düzeyinde yeniden yönlendirme sürümleri

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üzenleyebilirsiniz, otomatik bağlama yeniden yönlendirmesine güvenebilirsinizveya Yayımcı ilkesini atlayarakbağlama davranışını belirtebilirsiniz.

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

Derleme sorunlarını gidermek için uygulama yapılandırma dosyasını el ile düzenleyebilirsiniz. Örneğin, bir satıcı bir yayımcı ilkesi sağlamadan uygulamanızın kullandığı daha yeni bir sürümünü serbest bırakabilir, çünkü geriye dönük uyumluluğu garanti etmez, derleme bağlama bilgilerini uygulamanızın yapılandırma dosyasına aşağıdaki gibi yerleştirerek, uygulamanızı derlemenin daha yeni bir sürümünü kullanacak şekilde 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önlendirmeye güvenin

.NET Framework 4.5.1 veya sonraki bir sürümü hedefleyen Visual Studio bir masaüstü uygulaması oluşturduğunuzda, uygulama otomatik bağlama yeniden yönlendirme kullanır. Bu, iki bileşen aynı tanımlayıcı adlı derlemenin farklı sürümlerine başvurmışsa, çalışma zamanının çıkış uygulaması yapılandırma (app.config) dosyasındaki derlemenin daha yeni sürümüne otomatik olarak bir bağlama yeniden yönlendirmesi eklemesi anlamına gelir. Bu yeniden yönlendirme, başka bir şekilde gerçekleşmiş olabilecek derleme birleşme özelliğini geçersiz kılar. Kaynak app.config dosyası değiştirilmez. örneğin, uygulamanızın bir bant dışı .NET Framework bileşenine doğrudan başvurmasına, ancak aynı bileşenin eski bir sürümünü hedefleyen bir üçüncü taraf kitaplığı kullandığını varsayalım. Uygulamayı derlerken, çıkış uygulama yapılandırma dosyası, bileşenin daha yeni sürümüne bir bağlama yeniden yönlendirmesi içerecek şekilde değiştirilir. Bir Web uygulaması oluşturursanız, bağlama çakışmasıyla ilgili olarak bir derleme uyarısı alırsınız, bu da kaynak Web yapılandırma dosyasına gerekli bağlama yeniden yönlendirmesini ekleme seçeneği sunar.

kaynak app.config dosyasına, derleme zamanında el ile bağlama yeniden yönlendirmeleri eklerseniz, Visual Studio eklenen bağlama yeniden yönlendirmeleri temelinde derlemeleri birleştirmeye çalışır. Örneğin, bir derleme için aşağıdaki bağlama yeniden yönlendirmesini eklemenizi söyleyin:

<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önlendirme, uygulamanın bu derlemenin sürüm 2.0.0.0 üzerinde birleştirilmiş olması için çıkış app.config dosyasına aşağıdaki girişi ekler:

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

Uygulamanız .NET Framework eski sürümlerini hedefliyorsa otomatik bağlama yeniden yönlendirmesini etkinleştirebilirsiniz. Herhangi bir derleme için app.config dosyasında bağlama yeniden yönlendirme bilgilerini sağlayarak veya bağlama yeniden yönlendirme özelliğini kapatarak bu varsayılan davranışı geçersiz kılabilirsiniz. Bu özelliğin nasıl etkinleştirileceği veya devre dışı bırakılacağı hakkında bilgi için bkz. nasıl yapılır: etkinleştirme ve devre dışı bırakma otomatik bağlama yeniden yönlendirme.

Yayımcı ilkesini atla

Gerekirse, uygulama yapılandırma dosyasında yayımcı ilkesini geçersiz kılabilirsiniz. Örneğin, geriye dönük olarak uyumlu olması talep eden derlemelerin yeni sürümleri de bir uygulamayı bozabilir. Yayımcı ilkesini atlamak istiyorsanız, <publisherPolicy> <dependentAssembly> uygulama yapılandırma dosyasındaki öğesine bir öğe ekleyin ve Uygula özniteliğini Hayır olarak ayarlayın. Bu, önceki tüm Evet ayarlarını geçersiz kılar.

<publisherPolicy apply="no" />

Uygulamanızı kullanıcılarınız için çalıştırmaya devam etmek için yayımcı ilkesini atlayın, ancak sorunu derleme satıcısına bildirdiğinizden emin olun. Bir derlemenin yayımcı ilke dosyası varsa, satıcı derlemenin geriye dönük olarak uyumlu olduğundan ve istemcilerin yeni sürümü mümkün olduğunca kullanabilmesini sağlamalıdır.

Makine düzeyinde yeniden yönlendirme sürümleri

Bir makine yöneticisi bir bilgisayardaki tüm uygulamaların belirli bir derleme sürümünü kullanmasını istediğinde nadir durumlar olabilir. Örneğin, belirli bir sürüm bir güvenlik deliği düzeltilemeyebilir. Bir derleme makinenin yapılandırma dosyasında yeniden yönlendirilirse, machine.config olarak adlandırılan eski sürümü kullanan makinedeki 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 \config\machine.config%windir%\Microsoft.NET\Framework [ Version] veya 64 bit makineler için \config\machine.config%windir%\Microsoft.NET\Framework64 [ Version] bulunur.

Yapılandırma dosyalarında derleme bağlamayı belirtin

Uygulama yapılandırma dosyasında, makine yapılandırma dosyasında veya yayımcı ilke dosyasında olup olmadığı gibi bağlama yeniden yönlendirmeleri belirtmek için aynı XML biçimini kullanırsınız. Bir derleme sürümünü diğerine yeniden yönlendirmek için <bindingRedirect> öğesini kullanın. OldVersion özniteliği tek bir derleme sürümü veya bir dizi sürüm belirtebilir. newVersionÖznitelik tek 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 ve 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ğinde çeşitli bağlama yeniden yönlendirme senaryoları gösterilmektedir. Örnek, için bir dizi sürüm için yeniden yönlendirme myAssembly ve için tek bir bağlama yeniden yönlendirme belirtir mySecondAssembly . Örnek ayrıca yayımcı ilke dosyasının için bağlama yeniden yönlendirmelerini geçersiz kılmayacağını belirtir myThirdAssembly .

Bir derlemeyi bağlamak için, etiketindeki xmlns özniteliğiyle birlikte "urn: schemas-microsoft-com: asm. v1" dizesini belirtmeniz gerekir <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>

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

<assemblyBinding> Derleme bağlama başvurularını .NET Framework belirli bir sürümüne yönlendirmek için bir uygulama yapılandırma dosyasında öğesinde AppliesTo özniteliğini kullanabilirsiniz. bu isteğe bağlı öznitelik, hangi sürümün uygulanacağını göstermek için .NET Framework bir sürüm numarası kullanır. Hiçbir AppliesTo özniteliği belirtilmemişse, <assemblyBinding> öğesi .NET Framework tüm sürümleri için geçerlidir.

örneğin, bir .NET Framework 3,5 derlemesi için derleme bağlamayı yeniden yönlendirmek için, uygulama yapılandırma dosyanıza aşağıdaki XML kodunu dahil edersiniz.

<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 girmeniz gerekir. ö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 tüm .NET Framework bütünleştirilmiş kod yönlendirmesi için derleme bağlama yeniden yönlendirme bilgilerini girin ve bu nedenle tüm .NET Framework sürümleri için geçerlidir. Yeniden yönlendirmede bir çakışma varsa, yapılandırma dosyasındaki ilk eşleşen yeniden yönlendirme ekstresi kullanılır.

örneğin, bir .NET Framework 3,5 derlemesine bir başvuruyu ve .NET Framework 4 derlemesine başka bir başvuruyu yeniden yönlendirmek için aşağıdaki sözde kodda gösterilen kalıbı 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.