2009-11-16 13 views
7

Visual Studio 2008 projem, her ikisi de aynı üçüncü gruba (C) referans veren iki (harici) derlemeyi (A + B) referans alır. Bununla birlikte, A takımı, C montajının, B düzeneğinin sahip olmasını beklediğinden farklı olan bir kamu anahtarına sahip olmasını bekler.Referans iki eşit derlemeler, yalnızca genel anahtarlar farklıdır

İşte bariz istisna bir örnek:

dosya veya derleme yüklenemedi 'Newtonsoft.Json, Sürüm = 3.5.0.0, Culture = neutral, PublicKeyToken = 9ad232b50c3e6444' ya da bağımlılıklarından biri. Bulunan düzeneğin manifest tanımı, montaj referansı ile uyuşmuyor. (HRESULT özel durum: 0x80131040)

Tabii, onların dosya adları eşit olarak aynı dizinde C her iki sürümünü (sadece genel anahtar ayrılan) koymak mümkün olmaz. İkincisi, yapılandırma dosyasından derleme bağlamasının yalnızca ortak anahtar eşlemesi değil, sürüm eşlemesine izin verdiğini buldum.

Ayrıca, derlemeleri C'den birini ayrı bir dizine koymaya ve derlemeleri yüklerken bu dizinde aramak için CLR'yi yapılandırmaya çalıştım. Maalesef işe yaramazdım.

Dış kütüphanelerden birini (bir tanesi açık kaynaklı olmak üzere) yeniden derlemenin bu sorunu çözeceğini biliyordum, ancak gerekli değilse, bu yükü bakım planıma eklemek istemiyorum.

Bu yüzden sorum şu: yalnızca genel anahtarla farklılık gösteren C kümesinin her iki sürümüne nasıl başvururum?

GÜNCELLEME

ben ILMerge kullanarak ilginç bir çözüm sağlayan, ilgili soruya this answer tökezledi. Henüz kontrol etmedim ama bu sorunla uğraşan herkes için yararlı olabilir. AssemblyResolve çalıştıkları sürece

+1

Benzer bir sorun ve [bu] (http://stackoverflow.com/questions/2460542/using-different-versions-of-the-same-assembly-in-the-same-folder/2461746#2461746) vardı ben nasıl çözdüm. –

cevap

3

acaba: Ben tercih ettiğiniz sürümünü başvurulan ettik ve Assembly almak türünü SomeTypeInReferencedAssembly kullanabileceği tahmin ediyorum

AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve); 

static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) 
{ 
    if (args.Name == "full name with old key") 
    { 
     return typeof(SomeTypeInReferencedAssembly).Assembly; 
    } 
    return null; 
} 

He're; Ayrıca kullanabilirsiniz: "Sistem eskisi sorar dll bir sürümünü dağıtmak ve ne zaman - yalan"

return Assembly.Load("full name with new key"); 

bunu denemedim, ama burada esas söylüyorum.

+0

Teşekkürler, bu harika bir çözüm. Şimdi bir gün, referans verme meclislerinden birinin referanslarını C. olarak değiştireceğini umuyoruz. –

+0

Aslında, benim için işe yaramıyor: şimdi geri döndüğüm tipteki montaj tezahürünün referansın bildirisiyle uyuşmadığını söylüyor. Orada bir nokta var ... –

+0

Soruna rahatsız edici kodu gönderebilir misin, Sandor? –

3

Sen aynı sürümü iki meclisleri ama farklı kamu anahtarları asla olmamalıdır, o felakete davetiye var. Gerçek montaj sürümleri farklıysa, en kolay çözüm, bunları global assembly cache (GAC) içine yerleştirmektir. Bununla birlikte, C cinsinden tanımlanmış ve hem A hem de B'de kullanılan örneklerle uğraşırken (örneğin, C MyType bildirirse), B'den MyType örneğini elde ederseniz A. Çalışma zamanı söz konusu olduğunda, bu iki türün bir isim paylaşmanın yanı sıra birbirleriyle kesinlikle bir ilgisi yoktur.

Geçici bir çözüm arıyorsanız, Marc'la giderdim; Mükemmel çalışması gerektiği gibi geliyor.Bununla birlikte, bu yoldan aşağı indiğiniz gerçeği dev bir kırmızı bayrak olmalı.

+0

Kesinlikle haklısınız. Neyse ki, bu durumda, A ve B'nin etrafından hiçbir zaman geçmek zorunda kalmayacağım, çünkü birbirleriyle hiçbir ilgisi yok. Marc'ın çözümünü şimdi A veya B'nin C'ye referansını değiştirene kadar geçici bir çözüm olarak kullanıyorum. Bunun çok kötü olduğunu biliyorum ama sanırım A veya B'yi atmaktan başka uygun bir yol yok. –

İlgili konular