Çözümün oluşmasını engelleyen iki DLL'nin çakışması mümkün mü


9

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:


13

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 .


Bunun doğru olduğundan tam olarak emin değilim. CIL'a bakarsanız, CLR, belirli semboller içindeki sembollerin her bir sembolün önünde [montaj] gösterimi ile açıkça ifade eder. C # derleyicisinin bu sorunu zorlaması mümkündür, ancak bunun bir platform kısıtlaması olduğunu düşünmüyorum.
Yam Marcovic

@Yam Marcovic, uzman, belirli bir sınıfta hangi ad alanını kullanmaya çalıştığınızı nasıl anlayabilir? Tam nitelikli sınıf adı çatışmaları kesinlikle bir yapıyı önleyecektir.
Jeremy

C # derleyicisi, aynı addaki derlemelerle uğraşırken (ve muhtemelen aynı sembollerde tanımlanmışsa) derleme diğer adları için bir seçenek sunar. Bkz. Stackoverflow.com/questions/517058/…
Yam Marcovic

@Yam - Doğru, ancak bu bayrağı bilmeniz ve kullanmanız gerekiyor. Sadece montajı eklemek yapıyı bozar.
Oded

1
Açıkçası. Bu yüzden yardım için buraya geliyor, değil mi? Bu bayrağı bilmek ve kullanmak istiyor, çünkü projesini veya 3. taraf yardımcı programlarını etkilemeden ona daha temiz bir çözüm sunacak.
Yam Marcovic

4

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


3

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


+1 bu doğru cevap gibi görünüyor, "extern" takma adı hakkında nasıl değildi.
Jalayn

1

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?


1
Açıkça farklı sürümler eklemiyorum. Temelde bir WPF uygulamam var. Şimdi, bir üçüncü taraf özelliği eklemek için, bazı DLL'ler ekledim ve belki de çatışan bu DLL'ler.
Shamim Hafiz

1
Tamam, belki de üçüncü tarafla ilgili bu DLL'leri GAC'ye ekleyebilirsiniz? Bunları okuduğumdan beri uzun zaman geçti ama bunun sorununuzu çözebileceğinden şüpheleniyorum.
Jalayn

Burada GAC ​​ile ne kastedilmektedir?
Shamim Hafiz


0

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ç).


Popüler üçüncü taraf kütüphanelerine dayalı çözümler geliştirirseniz, aslında çok şey olur. Örneğin, bir twitter kütüphanesi, json lib'inizin eski bir sürümüne bağlı olabilir
Hoàng Long
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.