Bir derleme başvurusunun "Belirli Sürüm" özelliği Visual Studio'da tam olarak nasıl çalışır?


156

Bugün, Visual Studio 2010'da derleme başvurularının "Belirli Sürüm" özelliğine daha yakından baktım. Beklenmedik sonuçlarla yapılan birkaç denemeden sonra, özelliğin nasıl çalıştığı hakkında mümkün olduğunca çok şey öğrenmek için yola çıktım. SO bile, bana öyle geliyor ki, tüm cevapları yok, bu yüzden soruyu kendi kendine cevaplama girişimim:

Nasıl tam olarak yapar Visual Studio içinde bir montaj referans eserin "Belirli Versiyon" özelliği?

Yanıtlar:


255

Derleme zamanı bir özellik!

Bilmesi gereken en önemli şeylerden biri "Belirli Versiyon" etkili olacak bir özellik olmasıdır derleme zamanında ve değil çalışma zamanında.

Tüm bunlar ne hakkında?

Bir proje inşa edildiğinde, derleme sisteminin kullanması gereken fiziksel montajları bulmak için projenin montaj referanslarının çözülmesi gerekir. "Spesifik Versiyon" kontrolü yapılırsa ("Spesifik Versiyon" ne zaman kontrol edilir? "Bölümüne bakın), montaj çözümleme işleminin sonucunu etkiler:

  • Yapı sistemi, potansiyel olarak kullanabileceği fiziksel bir montaj bulur
  • Derleme sistemi, derleme başvurusu için fiziksel derlemenin sürümünü .csproj dosyasında depolanan derleme sürümüyle karşılaştırır
  • İki montaj sürümü tamamen aynıysa, çözünürlük işlemi başarılı olur ve bulunan fiziksel montaj yapı için kullanılır
  • İki montaj sürümü eşleşmezse, fiziksel montaj atılır ve çözümleme işlemi bir sonraki olası montajı bularak devam eder
  • Daha fazla potansiyel fiziksel montaj bulunamazsa, çözümleme işlemi başarısız olur. Bu, başvurunun çözümlenemediğini bildiren bir derleyici uyarısı (MSB3245 uyarısı) verir.
  • İlginçtir , yapı daha sonra devam eder! Kodun derlemeye gerçek bir başvurusu yoksa derleme başarılı olur (daha önce belirtilen uyarı ile). Kodun başvuruları varsa, derleme, kod bilinmeyen türler veya ad alanları kullanıyormuş gibi görünen bir hatayla başarısız olur. Derlemenin gerçekten başarısız olmasının tek göstergesi MSB3245 uyarısıdır.

Montajların çözülme sırası

Montaj çözümleme işleminin potansiyel montajları bulma sırası şu şekildedir:

  1. <HintPath>.Csproj dosyasındaki öğe tarafından başvurulan derleme
  2. Proje çıktı yolu
  3. GAC

Montajın GAC'de birkaç sürümü varsa, çözümleme işleminin önce en yüksek sürüme sahip montajı çözümlemeye çalıştığını unutmayın. Bu, yalnızca "Spesifik Versiyon" kontrolü yapılmamışsa önemlidir.

"Belirli Sürüm" ne zaman kontrol edilir?

Visual Studio, "Belirli Sürüm" denetiminin gerçekleştirilip gerçekleştirilmeyeceğine kararını .csproj dosyasında bulunan iki bilgi parçasına dayandırır:

  • <SpecificVersion>Öğenin varlığı veya yokluğu ve değeri (varsa)
  • Montaj referansında sürüm bilgilerinin varlığı veya yokluğu

Sürüm bilgileriyle tipik bir montaj referansı şöyle görünür:

<Reference Include="Foo, Version=1.2.3.4, Culture=neutral, processorArchitecture=MSIL">
  <SpecificVersion>True</SpecificVersion>
  <HintPath>..\..\Bar\Foo.dll</HintPath>
</Reference>

Derleme başvurusu sürüm bilgisi olmadan şöyle görünür :

<Reference Include="Foo">
[...]

Aşağıdaki tabloda "Belirli Sürüm" denetiminin ne zaman gerçekleştirildiği ve ne zaman yapılmadığı gösterilmektedir.

                            |     Version information
                            |  Present       Not present
----------------------------+------------------------------
<SpecificVersion>           |
- Present, has value True   |    Yes (1)        Yes (check always fails) (2)
- Present, has value False  |    No  (3)        No (4)
- Not present               |    Yes (5)        No (6)

Buradaki şaşırtıcı şey, hem <SpecificVersion>sürüm bilgileri hem de sürüm bilgileri yoksa hiçbir kontrol yapılmamasıdır (durum 6). Ben kontrol gerçekleştirilmesi ve her zaman başarısız olacağını umuyordum (durum 2 ile aynı) çünkü benim anlayış yokluğunda <SpecificVersion>varsayılan değeri "Doğru" ima eder. Bu, testlerimi yaptığım Visual Studio 2010'un tuhaflığı olabilir.

Visual Studio kullanıcı arabiriminde bir derleme başvurusunun özelliklerini incelediğinizde (başvuruyu seçin ve F4 tuşuna basın), "Belirli Sürüm" özelliği için gördüğünüz değer, Visual Studio'nun "Belirli Sürüm" gerçekleştirip gerçekleştirmeyeceğini bildirir Kontrol. 6. durumda, <SpecificVersion>öğe .csproj dosyasında bulunmasa da kullanıcı arabirimi "Doğru" gösterir .

"Yerel kopya" yan etkileri

"Yerel Kopyala" özelliği "Doğru" olarak ayarlanırsa, ancak "Belirli Sürüm" denetimi nedeniyle derleme çözümleme işlemi başarısız olursa, derleme kopyalanmaz.

Referans malzemesi


Detay için teşekkürler. Sadece kontrol edebilir miyim ... montaj sürümü kontrolü sadece güçlü isimlere sahip montajlar için olur; bu doğru mu? Ayrıca, bir derlemenin sürümünü denetleme hakkında konuştuğumuzda - bu başvurulan derlemenin adı karşılaştırılarak yapılır mı? (Güçlü bir derleme olması durumunda, bu ad sürüm bilgilerini içerir , bu nedenle ayrı bir sürüm alanı işaretlenmiş gibi değil mi?)
Gavin Hope

2
@GavinHope Soru 1: Hayır, sürüm denetimi güçlü adlarla sınırlı değildir, çünkü bir montaj adı sürümü içerebilir, ancak yine de güçlü bir ad olmayabilir (örneğin, PublicKeyToken=parçayı eksikse ). Ayrıca, tabloyu yazımın sonuna doğru kontrol ederseniz, Version=bölüm .csproj dosyasındaki montaj adında eksik olsa bile sürüm kontrolünün gerçekleşebileceğini görebilirsiniz . Soru 2: Derleme adının karşılaştırma için kullanıldığını varsayıyorum, evet. Bilgi için başka bir kaynak bilmezdim.
herzbube

"6 durumunda, Ucs" True "gösterir, ancak .Sproj dosyasında <SpecificVersion> öğesi mevcut değildir." - Varsayılan değerin Doğru olduğu anlaşılıyor . İçin kullanıcı arayüzünde Özgül Versiyon geçmek sonra true<SpecificVersion> etiketi tamamen önceden bir değeri vardı ki, ihmal edilmiş Yanlış .
samis

@herzbube - Bence Visual Studio> Proje Özellikleri penceresindeki "Belirli Sürüm "'ün anlamı, burada söylediklerinizin tam tersidir (bu, beklediğinizin tam tersidir). Visual Studio, "Belirli Sürüm" "değerinin (doğru veya yanlış), bu derlemenin derleme çözümlemesi için çoklu hedefleme kurallarına bakılmaksızın çözümlenip çözümlenemeyeceğini belirtir .
N73k

35

Bir başvuru eklediğinizde, Visual Studio derlemenin [AssemblyVersion] proje dosyasına kaydeder. Bu önemli. Örneğin, bir yıl sonra bir hata düzeltmesi oluşturursanız, projeyi referansın tam olarak aynı sürümüyle yeniden oluşturduğunuzdan emin olun, böylece gerçek bir bırakma olur. Referans montajı değiştiyse bir hata mesajı alırsınız.

Ancak bu her zaman arzu edilmez. Bazı programcılar montaj sürümünün otomatik olarak artmasına izin verir ve her yeniden oluşturmada yeni bir sürüm oluşturur. Meclisin kamusal arayüzü asla değişmese de. Bazıları, kütüphanelerini almak için Nuget'i kullanarak projelerini yapılandırır ve yeni bir sürüm çıktığında kütüphaneyi otomatik olarak güncellemesine izin verir. Derleme hatasını bastırmak için Belirli Sürüm özelliğini Yanlış olarak ayarlamak isteyeceklerdir.

Sonucu anlamak oldukça önemlidir, kazaları önlemek için programın tüm yapısını yeniden konuşlandırmanız gerekir. Çalışma zamanında sürüm uyuşmazlıkları programı <bindingRedirect>kilitler ve yalnızca riskli olan .config dosyasında bastırılabilir .


2
"Spesifik Versiyon" un neden önemli olduğu için teşekkürler , bu benim cevabımda ele aldığım tamamen mekanik yönleri iyi bir arkadaştır.
herzbube

@Hans Passant - son paragrafınız SpecificVersion True veya False için geçerli mi? Bence bunlar bunu doğruya ayarladığınızda sonuçlar.
GreenEyedAndy

1
SpecificVersion yalnızca uygulamanızı oluşturmak için geçerlidir. Çalışma zamanında CLR her zaman referans montaj sürüm numarası ile tam bir eşleşme konusunda ısrar eder. Oluşturma zamanında daha yeni bir sürüm kullandıysanız, çalışma zamanında da daha yeni bir sürüm olması gerekir.
Hans Passant

1
VS2013 & .Net 4.5.1 dikkat AutoGenerateBindingRedirects Onlar belirli bir sürümünü kullanmak için bunu söylediği halde daha yeni bir sürümü bağlanma dll yönlendirebilir
Dennis Kuypers

1
@HansPassant [AssemblyVersion]Meclisler güçlü bir isim imzalanmadığında CLR'nin dikkate almadığını düşündüm .
tm1
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.