Çalışma Zamanının Derlemelerin Konumunu Bulması

.NET Framework uygulamanızı başarıyla dağıtmak için, ortak dil çalışma zamanının uygulamanızı oluşturan derlemeleri nasıl bulup bağladığını anlamanız gerekir. Varsayılan olarak, çalışma zamanı uygulamanın oluşturulduğu derlemenin tam sürümüyle bağlanmaya çalışır. Bu varsayılan davranış, yapılandırma dosyası ayarları tarafından geçersiz kılınabilir.

Ortak dil çalışma zamanı, bir derlemeyi bulmaya ve derleme başvurularını çözümlemeye çalışırken bir dizi adım gerçekleştirir. Her adım aşağıdaki bölümlerde açıklanmıştır. Yoklama terimi genellikle çalışma zamanının derlemeleri nasıl bulduğunda kullanılır; derlemeyi adı ve kültürüne göre bulmak için kullanılan buluşsal yöntemler kümesini ifade eder.

Not

Windows SDK'sında bulunan Derleme Bağlama Günlük Görüntüleyicisi'ni (Fuslogvw.exe) kullanarak günlük dosyasında bağlama bilgilerini görüntüleyebilirsiniz.

Bağlama başlatılıyor

Bir derlemeyi bulma ve bağlama işlemi, çalışma zamanı başka bir derlemeye başvuruyu çözümlemeye çalıştığında başlar. Bu başvuru statik veya dinamik olabilir. Derleyici derleme zamanında derleme bildiriminin meta verilerinde statik başvuruları kaydeder. Dinamik başvurular, gibi Assembly.Loadçeşitli yöntemleri çağırmanın bir sonucu olarak anında oluşturulur.

Derlemeye başvurmanın tercih edilen yolu, derleme adı, sürüm, kültür ve ortak anahtar belirteci (varsa) dahil olmak üzere tam başvuru kullanmaktır. Çalışma zamanı, bu bölümün ilerleyen bölümlerinde açıklanan adımları izleyerek derlemeyi bulmak için bu bilgileri kullanır. Çalışma zamanı, başvurunun statik veya dinamik bir derleme için olup olmadığına bakılmaksızın aynı çözümleme işlemini kullanır.

Ayrıca, çağırma yöntemine derleme hakkında yalnızca derleme adını belirtme gibi kısmi bilgiler sağlayarak bir derlemeye dinamik başvuru yapabilirsiniz. Bu durumda, derleme için yalnızca uygulama dizininde arama yapılır ve başka bir denetim gerçekleşmez. veya AppDomain.Loadgibi Assembly.Load derlemeleri yüklemek için çeşitli yöntemlerden herhangi birini kullanarak kısmi başvuru yaparsınız.

Son olarak, gibi Assembly.Load bir yöntem kullanarak dinamik başvuru yapabilir ve yalnızca kısmi bilgiler sağlayabilirsiniz; ardından uygulama yapılandırma dosyasındaki <qualifyAssembly> öğesini kullanarak başvuruyu niteleyebilirsiniz. Bu öğe, kodunuzda değil uygulama yapılandırma dosyanızda tam başvuru bilgilerini (ad, sürüm, kültür ve varsa ortak anahtar belirteci) sağlamanıza olanak tanır. Uygulama dizini dışındaki bir derlemeye başvuruyu tam olarak nitelemek istiyorsanız veya genel derleme önbelleğindeki bir derlemeye başvurmak istiyorsanız ancak kodunuzda değil yapılandırma dosyasında tam başvuruyu belirtme kolaylığı sağlamak istiyorsanız bu tekniği kullanırsınız.

Not

Bu kısmi başvuru türü, çeşitli uygulamalar arasında paylaşılan derlemelerle kullanılmamalıdır. Yapılandırma ayarları derleme başına değil uygulama başına uygulandığından, bu tür kısmi başvuru kullanan paylaşılan bir derleme, paylaşılan derlemeyi kullanan her uygulamanın yapılandırma dosyasında uygun bilgilere sahip olmasını gerektirir.

Çalışma zamanı, derleme başvurularını çözümlemek için aşağıdaki adımları kullanır:

  1. Uygulama yapılandırma dosyası, yayımcı ilke dosyası ve makine yapılandırma dosyası gibi geçerli yapılandırma dosyalarını inceleyerek doğru derleme sürümünü belirler. Yapılandırma dosyası uzak bir makinede bulunuyorsa, çalışma zamanının önce uygulama yapılandırma dosyasını bulup indirmesi gerekir.

  2. Derleme adının önceye bağlı olup olmadığını denetler ve bağlıysa daha önce yüklenmiş derlemeyi kullanır. Derlemeyi yüklemek için önceki bir istek başarısız olduysa, derleme yüklenmeye çalışılmadan istek hemen başarısız olur.

    Not

    Derleme bağlama hatalarını önbelleğe alma işlemi .NET Framework sürüm 2.0'da yenidir.

  3. Genel derleme önbelleğini denetler. Derleme orada bulunursa, çalışma zamanı bu derlemeyi kullanır.

  4. Aşağıdaki adımları kullanarak derleme için yoklamalar :

    1. Yapılandırma ve yayımcı ilkesi özgün başvuruyu etkilemezse ve bağlama isteği yöntemi kullanılarak Assembly.LoadFrom oluşturulduysa, çalışma zamanı konum ipuçlarını denetler.

    2. Yapılandırma dosyalarında bir kod tabanı bulunursa, çalışma zamanı yalnızca bu konumu denetler. Bu araştırma başarısız olursa, çalışma zamanı bağlama isteğinin başarısız olduğunu ve başka bir yoklama gerçekleşmediğini belirler.

    3. Yoklama bölümünde açıklanan buluşsal yöntemleri kullanarak derleme için yoklamalar. Yoklamadan sonra derleme bulunamazsa, çalışma zamanı Windows Installer'ın derlemeyi sağlamasını istemektedir. Bu, isteğe bağlı yükleme özelliği işlevi görür.

      Not

      Tanımlayıcı adları olmayan derlemeler için sürüm denetimi yoktur ve çalışma zamanı, tanımlayıcı adları olmayan derlemeler için genel derleme önbelleğini denetlemez.

Adım 1: Yapılandırma Dosyalarını İnceleme

Derleme bağlama davranışı üç XML dosyasına göre farklı düzeylerde yapılandırılabilir:

  • Uygulama yapılandırma dosyası.

  • Publisher ilke dosyası.

  • Makine yapılandırma dosyası.

Bu dosyalar aynı söz dizimini izler ve bağlama yeniden yönlendirmeleri, kodun konumu ve belirli derlemeler için bağlama modları gibi bilgiler sağlar. Her yapılandırma dosyası bağlama işlemini yeniden yönlendiren bir <assemblyBinding> öğesi içerebilir. assemblyBinding öğesinin < alt öğeleri dependentAssembly> öğesini içerir<.> dependentAssembly öğesinin < alt öğeleri assemblyIdentity> öğesini,< bindingRedirect> öğesini ve< codeBase> öğesini içerir.<>

Not

Yapılandırma bilgileri üç yapılandırma dosyasında bulunabilir; tüm yapılandırma dosyalarında tüm öğeler geçerli değildir. Örneğin, bağlama modu ve özel yol bilgileri yalnızca uygulama yapılandırma dosyasında olabilir. Her dosyada yer alan bilgilerin tam listesi için bkz . Yapılandırma Dosyalarını Kullanarak Uygulamaları Yapılandırma.

Uygulama Yapılandırma Dosyası

İlk olarak, ortak dil çalışma zamanı uygulama yapılandırma dosyasını çağıran derlemenin bildiriminde depolanan sürüm bilgilerini geçersiz kılan bilgileri denetler. Uygulama yapılandırma dosyası bir uygulamayla dağıtılabilir, ancak uygulama yürütme için gerekli değildir. Genellikle bu dosyanın alınması neredeyse anlıktır, ancak uygulama tabanının uzak bir bilgisayarda olduğu durumlarda (web tabanlı bir senaryoda olduğu gibi) yapılandırma dosyasının indirilmesi gerekir.

İstemci yürütülebilir dosyaları için, uygulama yapılandırma dosyası uygulamanın yürütülebilir dosyasıyla aynı dizinde bulunur ve .config uzantısına sahip yürütülebilir dosyayla aynı temel ada sahiptir. Örneğin, C:\Program Files\Myapp\Myapp.exe için yapılandırma dosyası C:\Program Files\Myapp\Myapp.exe.config şeklindedir. Tarayıcı tabanlı bir senaryoda, HTML dosyasının <yapılandırma dosyasına açıkça işaret etmek için bağlantı> öğesini kullanması gerekir.

Aşağıdaki kod, uygulama yapılandırma dosyasının basit bir örneğini sağlar. Bu örnek, TextWriterTraceListener bir dosyaya Listeners hata ayıklama bilgilerini kaydetmeyi etkinleştirmek için koleksiyona bir ekler.

<configuration>
   <system.diagnostics>
      <trace useGlobalLock="false" autoflush="true" indentsize="0">
         <listeners>
            <add name="myListener" type="System.Diagnostics.TextWriterTraceListener, system version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" initializeData="c:\myListener.log" />
         </listeners>
      </trace>
   </system.diagnostics>
</configuration>

Publisher İlke Dosyası

İkincisi, çalışma zamanı varsa yayımcı ilkesi dosyasını inceler. Yayımcı ilke dosyaları, bir bileşen yayımcısı tarafından paylaşılan bir bileşene düzeltme veya güncelleştirme olarak dağıtılır. Bu dosyalar, paylaşılan bileşenin yayımcısı tarafından verilen ve derleme başvurularını yeni bir sürüme yönlendiren uyumluluk bilgilerini içerir. Uygulama ve makine yapılandırma dosyalarından farklı olarak, yayımcı ilkesi dosyaları genel derleme önbelleğine yüklenmesi gereken kendi derlemelerinde bulunur.

Aşağıda Yayımcı İlkesi yapılandırma dosyası örneği verilmiştir:

<configuration>
    <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">

            <dependentAssembly>
                <assemblyIdentity name="asm6" publicKeyToken="c0305c36380ba429" />
                <bindingRedirect oldVersion="3.0.0.0" newVersion="2.0.0.0"/>
            </dependentAssembly>

        </assemblyBinding>
    </runtime>
</configuration>

Derleme oluşturmak için Al.exe (Derleme Bağlayıcısı) aracını aşağıdaki gibi bir komutla kullanabilirsiniz:

Al.exe /link:asm6.exe.config /out:policy.3.0.asm6.dll /keyfile: compatkey.dat /v:3.0.0.0

compatkey.dat bir tanımlayıcı ad anahtar dosyasıdır. Bu komut, genel derleme önbelleğine yerleştirebileceğiniz tanımlayıcı adlı bir derleme oluşturur.

Not

Yayımcı ilkesi, paylaşılan bileşen kullanan tüm uygulamaları etkiler.

Yayımcı ilkesi yapılandırma dosyası, uygulamadan (derleme bildiriminden veya uygulama yapılandırma dosyasından) gelen sürüm bilgilerini geçersiz kılar. Uygulama yapılandırma dosyasında derleme bildiriminde belirtilen sürümü yeniden yönlendirecek bir deyim yoksa, yayımcı ilke dosyası derleme bildiriminde belirtilen sürümü geçersiz kılar. Ancak, uygulama yapılandırma dosyasında yeniden yönlendirme deyimi varsa, yayımcı ilkesi bildirimde belirtilen sürüm yerine bu sürümü geçersiz kılar.

Paylaşılan bir bileşen güncelleştirildiğinde yayımcı ilke dosyası kullanılır ve paylaşılan bileşenin yeni sürümü bu bileşeni kullanan tüm uygulamalar tarafından alınmalıdır. Uygulama yapılandırma dosyası güvenli modu zorlamadığı sürece, yayımcı ilkesi dosyasındaki ayarlar uygulama yapılandırma dosyasındaki ayarları geçersiz kılar.

Kasa Modu

Yayımcı ilke dosyaları genellikle bir hizmet paketi veya program güncelleştirmesinin parçası olarak açıkça yüklenir. Yükseltilen paylaşılan bileşenle ilgili bir sorun varsa, yayımcı ilkesi dosyasındaki geçersiz kılmaları güvenli modu kullanarak yoksayabilirsiniz. Kasa modu,<publisherPolicy apply="yes|no"/> öğesi, yalnızca uygulama yapılandırma dosyasında bulunur. Yayımcı ilkesi yapılandırma bilgilerinin bağlama işleminden kaldırılıp kaldırılmayacağını belirtir.

Kasa modu, uygulamanın tamamı veya seçili derlemeler için ayarlanabilir. Başka bir ifadeyle, uygulamayı oluşturan tüm derlemeler için ilkeyi kapatabilir veya bazı derlemeler için açıp diğer derlemeler için açabilirsiniz. Yayımcı ilkesini bir uygulamayı oluşturan derlemelere seçmeli olarak uygulamak için publisherPolicy apply=no/> değerini ayarlayın <ve dependentAssembly> öğesini kullanarak <hangi derlemelerin etkilenmesini istediğinizi belirtin. Yayımcı ilkesini uygulamayı oluşturan tüm derlemelere uygulamak için publisherPolicy apply=no/> öğesini bağımlı derleme öğesi olmadan ayarlayın<. Yapılandırma hakkında daha fazla bilgi için bkz . Yapılandırma Dosyalarını kullanarak Uygulamaları Yapılandırma.

Makine Yapılandırma Dosyası

Üçüncüsü, çalışma zamanı makine yapılandırma dosyasını inceler. Machine.config adlı bu dosya, çalışma zamanının yüklü olduğu kök dizinin Config alt dizinindeki yerel bilgisayarda bulunur. Bu dosya, yöneticiler tarafından bu bilgisayarda yerel olan derleme bağlama kısıtlamalarını belirtmek için kullanılabilir. Makine yapılandırma dosyasındaki ayarlar diğer tüm yapılandırma ayarlarından önceliklidir; ancak bu, tüm yapılandırma ayarlarının bu dosyaya konulacağı anlamına gelmez. Yönetici ilke dosyası tarafından belirlenen sürüm sondur ve geçersiz kılınamaz. Machine.config dosyasında belirtilen geçersiz kılmalar tüm uygulamaları etkiler. Yapılandırma dosyaları hakkında daha fazla bilgi için bkz . Yapılandırma Dosyalarını kullanarak Uygulamaları Yapılandırma.

Adım 2: Önceden Başvurulan Derlemeleri Denetleme

İstenen derleme önceki çağrılarda da istendiyse, ortak dil çalışma zamanı zaten yüklenmiş olan derlemeyi kullanır. Bu, bir uygulamayı oluşturan derlemeleri adlandırırken sonuçları olabilir. Derlemeleri adlandırma hakkında daha fazla bilgi için bkz . Derleme Adları.

Derleme için önceki bir istek başarısız olduysa, derleme için sonraki istekler derlemeyi yüklemeye çalışmadan hemen başarısız olur. .NET Framework sürüm 2.0'dan başlayarak, derleme bağlama hataları önbelleğe alınır ve önbelleğe alınan bilgiler derlemeyi yüklemeyi deneyip denemeyeceğini belirlemek için kullanılır.

Not

Bağlama hatalarını önbelleğe almamış olan .NET Framework 1.0 ve 1.1 sürümlerinin <davranışına geri dönmek için yapılandırma dosyanıza disable Önbelleğe Alma BindingFailures> Öğesini ekleyin.

Adım 3: Genel Derleme Önbelleğini Denetleme

Tanımlayıcı adlandırılmış derlemeler için bağlama işlemi genel derleme önbelleğine bakarak devam eder. Genel derleme önbelleği, bir bilgisayardaki çeşitli uygulamalar tarafından kullanılabilecek derlemeleri depolar. Genel derleme önbelleğindeki tüm derlemelerin tanımlayıcı adları olmalıdır.

Adım 4: Kod Temelleri veya Algılama Aracılığıyla Derlemenin Konumunu Bulma

Doğru derleme sürümü, çağıran derlemenin başvurusundaki ve yapılandırma dosyalarındaki bilgiler kullanılarak belirlendikten sonra ve genel derleme önbelleğini iade ettikten sonra (yalnızca tanımlayıcı adlandırılmış derlemeler için), ortak dil çalışma zamanı derlemeyi bulmaya çalışır. Bir derlemeyi bulma işlemi aşağıdaki adımları içerir:

  1. Uygulama yapılandırma dosyasında bir <codeBase> öğesi bulunursa, çalışma zamanı belirtilen konumu denetler. Eşleşme bulunursa, bu derleme kullanılır ve yoklama gerçekleşmez. Derleme orada bulunmazsa bağlama isteği başarısız olur.

  2. Çalışma zamanı daha sonra bu bölümde belirtilen kuralları kullanarak başvuruda bulunılan derleme için yoklar.

Not

Dizinde bir derlemenin birden çok sürümü varsa ve bu derlemenin belirli bir sürümüne başvurmak istiyorsanız, yoklama öğesinin özniteliği <yerine privatePath codeBase> öğesini kullanmanız <gerekir.> Yoklama öğesini kullanırsanız <, çalışma zamanı başvurulan basit derleme adıyla eşleşen bir derlemeyi ilk bulduğunda( doğru bir eşleşme olup olmadığı) yoklama> işlemini durdurur. Doğru bir eşleşmeyse, bu derleme kullanılır. Doğru eşleşme değilse, yoklama durdurulur ve bağlama başarısız olur.

Codebases aracılığıyla Derlemeyi Bulma

Kod tabanı bilgileri, yapılandırma dosyasındaki bir <codeBase> öğesi kullanılarak sağlanabilir. Bu kod tabanı, çalışma zamanı başvuruda bulunılan derleme için araştırma yapmaya çalışmadan önce her zaman denetlenmektedir. Son sürüm yeniden yönlendirmesini içeren bir yayımcı ilkesi dosyası da bir <codeBase> öğesi içeriyorsa, bu< codeBase> öğesi kullanılan öğedir. Örneğin, uygulama yapılandırma dosyanız bir <codeBase> öğesi belirtirse ve uygulama bilgilerini geçersiz kılmaya yönelik bir yayımcı ilke dosyası da bir< codeBase> öğesi belirtirse, <yayımcı ilke dosyasındaki codeBase> öğesi kullanılır.

codeBase> öğesi tarafından <belirtilen konumda eşleşme bulunmazsa bağlama isteği başarısız olur ve başka bir adım atılamaz. Çalışma zamanı bir derlemenin çağıran derlemenin ölçütleriyle eşleşeceğini belirlerse, bu derlemeyi kullanır. Verilen <codeBase> öğesi tarafından belirtilen dosya yüklendiğinde, çalışma zamanı adın, sürümün, kültürün ve ortak anahtarın çağıran derlemenin başvurusuyla eşleştiğinden emin olmak için denetler.

Not

Uygulamanın kök dizini dışındaki başvuruda bulunılan derlemelerin tanımlayıcı adları olmalıdır ve genel derleme önbelleğine yüklenmelidir veya codeBase> öğesi kullanılarak <belirtilmelidir.

Derlemeyi Yoklama Yoluyla Bulma

Uygulama yapılandırma dosyasında codeBase> öğesi yoksa<, çalışma zamanı derleme için dört ölçüt kullanarak yoklar:

  • Uygulamanın yürütüldüğü kök konum olan uygulama tabanı.

  • Başvurulan derlemenin kültür özniteliği olan kültür.

  • Başvurulan derlemenin adı olan Ad.

  • privatePath Kök konumu altındaki <alt dizinlerin kullanıcı tanımlı listesi olan yoklama> öğesinin özniteliği. Bu konum, bir uygulama etki alanının özelliği kullanılarak AppDomainSetup.PrivateBinPath uygulama yapılandırma dosyasında ve yönetilen kodda belirtilebilir. Yönetilen kodda belirtildiğinde, yönetilen kod privatePath önce yoklanır ve ardından uygulama yapılandırma dosyasında belirtilen yol izlenir.

Uygulama Tabanı ve Kültür Dizinlerini Yoklama

Çalışma zamanı her zaman uygulamanın tabanında yoklama işlemine başlar. Bu, url veya bilgisayardaki uygulamanın kök dizini olabilir. Başvurulan derleme uygulama tabanında bulunmazsa ve kültür bilgisi sağlanmazsa, çalışma zamanı tüm alt dizinlerde derleme adıyla arama yapar. Yoklanan dizinler şunlardır:

  • [uygulama tabanı] / [derleme adı].dll

  • [uygulama tabanı] / [derleme adı] / [derleme adı].dll

Başvuruda bulunılan derleme için kültür bilgileri belirtilirse, yalnızca aşağıdaki dizinler yoklanır:

  • [uygulama tabanı] / [kültür] / [derleme adı].dll

  • [uygulama tabanı] / [kültür] / [derleme adı] / [derleme adı].dll

privatePath Özniteliği ile yoklama

Çalışma zamanı, kültür alt dizinlerine ve başvuruda bulunılan derleme için adlandırılan alt dizinlere ek olarak, yoklama öğesinin privatePath<özniteliği kullanılarak belirtilen dizinleri de yoklar.> özniteliği kullanılarak privatePath belirtilen dizinler, uygulamanın kök dizininin alt dizinleri olmalıdır. Yoklanan dizinler, kültür bilgilerinin başvuruda bulunup bulunmadığına bağlı olarak değişir.

Çalışma zamanı, başvurulan basit derleme adıyla eşleşen bir derlemeyi ilk bulduğunda doğru eşleşme olup olmadığını araştırmayı durdurur. Doğru bir eşleşmeyse, bu derleme kullanılır. Doğru eşleşme değilse, yoklama durdurulur ve bağlama başarısız olur.

Kültür dahil edilirse, aşağıdaki dizinler yoklanır:

  • [uygulama tabanı] / [binpath] / [culture] / [derleme adı].dll

  • [uygulama tabanı] / [binpath] / [culture] / [derleme adı] / [derleme adı].dll

Kültür bilgileri dahil edilmezse, aşağıdaki dizinler yoklanır:

  • [uygulama tabanı] / [binpath] / [derleme adı].dll

  • [uygulama tabanı] / [binpath] / [derleme adı] / [derleme adı].dll

Yoklama Örnekleri

Aşağıdaki bilgiler verilmiştir:

Çalışma zamanı aşağıdaki URL'leri yoklar:

  • http://www.code.microsoft.com/de/myAssembly.dll

  • http://www.code.microsoft.com/de/myAssembly/myAssembly.dll

  • http://www.code.microsoft.com/bin/de/myAssembly.dll

  • http://www.code.microsoft.com/bin/de/myAssembly/myAssembly.dll

Aynı Ada Sahip Birden Çok Derleme

Aşağıdaki örnekte aynı ada sahip birden çok derlemenin nasıl yapılandırılır gösterilmektedir.

<dependentAssembly>
   <assemblyIdentity name="Server" publicKeyToken="c0305c36380ba429" />
   <codeBase version="1.0.0.0" href="v1/Server.dll" />
   <codeBase version="2.0.0.0" href="v2/Server.dll" />
</dependentAssembly>

Diğer Konumlar Yoklandı

Derleme konumu, geçerli bağlama bağlamı kullanılarak da belirlenebilir. Bu durum genellikle yöntemi kullanıldığında ve COM birlikte çalışma senaryolarında ortaya çıkar Assembly.LoadFrom . Bir derleme başka bir derlemeye başvurmak için yöntemini kullanırsa LoadFrom , çağıran derlemenin konumu başvuruda bulunacağı yer hakkında bir ipucu olarak kabul edilir. Eşleşme bulunursa, bu derleme yüklenir. Eşleşme bulunmazsa, çalışma zamanı arama semantiğiyle devam eder ve derlemeyi sağlamak için Windows Installer'ı sorgular. Bağlama isteğiyle eşleşen bir derleme sağlanmazsa, bir özel durum oluşturulur. Bu özel durum, TypeLoadException bir türe başvurulduysa veya yüklenen bir FileNotFoundException derleme bulunamadığında yönetilen kodda bir durumdur.

Örneğin, Assembly1 Derleme2 ve Derleme1'den http://www.code.microsoft.com/utilsindirildiyse, bu konum Assembly2.dll nerede bulunacağı hakkında bir ipucu olarak kabul edilir. Çalışma zamanı daha sonra ve http://www.code.microsoft.com/utils/Assembly2/Assembly2.dlliçindeki http://www.code.microsoft.com/utils/Assembly2.dll derleme için yoklar. Assembly2 bu konumlardan birinde bulunmazsa, çalışma zamanı Windows Installer'ı sorgular.

Ayrıca bkz.