Belirli bir vakam olmasına rağmen, genel durumu merak ediyordum.
Visual C # projesine başvuru olarak eklendiğinde iki DLL, çözümün oluşmasını önlemek için birbiriyle çarpışabilir mi? Bu durumda, bunu hafifletmenin olası yolları nelerdir.
Belirli bir vakam olmasına rağmen, genel durumu merak ediyordum.
Visual C # projesine başvuru olarak eklendiğinde iki DLL, çözümün oluşmasını önlemek için birbiriyle çarpışabilir mi? Bu durumda, bunu hafifletmenin olası yolları nelerdir.
Yanıtlar:
Bu çok mümkün.
Farklı montajlarda (veya projenizde ve eklenen montajda) özdeş bir ad alanı ve tür adı tanımladıysanız, bu türlerden birini veya başkalarını kullanmaya çalışan herhangi bir kodla çakışırsınız.
Benzersiz ad alanlarına sahip olduğunuzdan emin olursanız, referanslarınız gibi bu sorun da olmaz.
Başka bir olasılık, bağımlılığın farklı sürümleri ile ilgilidir - eğer projeniz 1.2 sürümünde bir günlük kütüphanesi kullanıyorsa (ancak) eklenen derlemenin aynı derleme ancak farklı bir sürümü (örneğin 1.3) ve projeniz için bir bağımlılığı varsa veya eklenen derleme belirli bir sürümü kullanmak üzere yapılandırılmış / oluşturulmuşsa, bir çakışma oluşur ve derleme başarısız olur.
Bu sorunların her ikisi de burada açıklandığı gibi montaj takma adları kullanılarak çözülebilir .
Kimsenin bundan bahsetmediğini görünce, sordunuz:
bunu hafifletmenin olası yolları nelerdir
Sadece bu durum için, kısıtlama olmaksızın ve can sıkıcı geçici çözümler olmadan temiz bir çözüm var. Derleme yardımcılarını tanımlayabilirsiniz, böylece derleyici hangilerine doğru yerde başvuracağını bilecektir.
Http://blogs.msdn.com/b/ansonh/archive/2006/09/27/774692.aspx adresine bir göz atın
Evet, bu çok mümkün.
Diyelim ki Lucene.Net'in eski sürümünü kullanan bazı DLL'lere bir başvuru eklediniz ve en son sürümü eklemek istiyorsunuz.
Bu sorunu harici takma adlar kullanarak çözebilirsiniz: http://msdn.microsoft.com/en-us/library/ms173212.aspx
Bir derlemenin , güçlü bir şekilde adlandırılmış olmaları koşuluyla , Genel Derleme Önbelleği'ne istediğiniz kadar çok farklı sürüm koyabilirsiniz . Farklı uygulamaların bir montajın farklı sürümlerini makine bazında kullanmasını istiyorsanız bu size yardımcı olabilir. Ancak ONE uygulamasında bir montajın farklı sürümlerini kullanmak yine de başınızı belaya sokacaktır.
Her iki sürüme de aynı anda ihtiyacınız olmasının nedeni nedir?
Kesinlikle. İki nesne ayırt edilemediğinde "Belirsiz Referans" derleyici hatasını alabilirsiniz. Tipik olarak, kodda tam yolu belirtebilirsiniz ve bu bir soruna neden olmaz, ancak dll tamamen aynı olsaydı, iki nesne arasında herhangi bir şekilde ayırt edemezsiniz. Sya biz iki dll var:
File sınıfını içeren System.IO
ve
Bir File sınıfı içeren MyProject.IO
Eğer böyle bir şeye sahip olsaydın ...
using System.IO;
using MyProject.IO;
...
private void foo()
{
File f = new File();
}
... hangi dosyadan bahsettiğinizi söylemenin bir yolu olmadığından belirsiz bir referansınız olur. Bu sorunu düzeltir:
using System.IO;
using MyProject.IO;
...
private void foo()
{
MyProject.IO.File f = new MyProject.IO.File();
}
Düzeltmek zor olacak tek yolu, "Dosya" yolu her iki derlemede aynı olsa, ancak bu iki dll aynı ad alanı yapısına sahip olası bir durum gerektiriyordu olurdu. Örneğin, yukarıdaki durumum asla gerçekleşmeyecekti, çünkü kimse orada "Sistem" adını vermeyecektir (.Net çerçevesinin gerçek geliştiricileri hariç).