2013-08-01 18 views
6

toy project'un yeni bir küçük sürümünü yayınlama aşamasındayım. Bu proje NuGet'te yayımlandı ve .NET 4.0 ve üstü ile uyumlu. Ben tanıtmak yeni özellikler bazıları .NET 4.5 gerektirir (kullanıcılar, her ikisi de .NET 4.5 tanıtıldı arayüzleri IReadOnlyCollection<T> ve IReadOnlyList<T> çözmek mümkün olmalıdır), ama ben değil, .NET 4.0 ile uyumlu proje tutmak gerekir tüm geliştiriciler kolayca en son .NET çerçevesine geçirilebilir.Yeniden kullanılabilir bir .NET kitaplığında ileri uyumluluk nasıl etkinleştirilir?

Karşılaştığım sorun, bu "ileri düzey uyumluluk" sorununun nasıl çözüleceğidir. Düşündüğüm iki çözüm var, ancak ikisi de çok çekici değil, bu yüzden umarım birileri bana burada bazı fikirler veya rehberlik verebilir.

Çözüm 1: Burada

Ben ile geldi iki çözüm vardır kullanın #if derleyici direktifleri ve proje sahasında Nuget paketleri ve indirme kullanarak bu sürümleri .NET framework sürümü başına bir DLL oluşturmak ve gemi.

Bu yöntemin olumsuz tarafı, geliştiricilerin Visual Studio projelerini .NET 4.0'dan .NET 4.5'e güncelleştirdiğinde, otomatik olarak .NET 4.5 sürümünü (.NET 4.5'e özgü özellikleriyle) almazlar. Bu, Principle of least astonishment numaralı telefonu ihlal ediyor ve geliştiricilerin, özelliği birkaç ay sonra kullanmayı denedikleri zaman neden çalışmadığını görünce bırakacaktı.

Çözüm 2: Geçerli uygulama etki alanında bulunduklarında yeni arabirimleri uygulayan tek bir DLL ve yayıcı türü kullanın. Bu, kullanıcıya tek bir DLL gönderilmesine izin verir ve geliştiricilerin .NET framework sürümlerini projelerinde değiştirdiğinde özelliklerin kullanılabilir olmasını sağlar. Bu, işleri sadece işe yarar hale getirecektir. Şu anda btw'ye yöneldiğim yön budur.

Arabirimleri gerçekleştirmesi gereken bir türü döndürmem gerektiğinden, bu tür yansımaların çalışma zamanında Reflection.Emit, ModuleBuilder, TypeBuilder ve benzeri kullanılarak oluşturulması gerekir. Bu ciddi bir çiseleşme. Fakat bunun yanında, bu türün yeni (anonim) bir mecliste oluşturulması gerektiğinden, bazı içsel türleri kamusallaştırmalıyım (bir miras alması gereken bir tür ve uygulamak istediği bir arayüz). Bu iç tiplerin kamuya açık hale getirilmesi projenin API'sini kirletir ve bu tiplerde değişiklik yapmamı engeller.

Bunların benim seçeneklerim olduğuna inanıyorum ama açık bir şey eksik olabilir. Yani sorum şu ki, bir ihtimal kaçırıyor muyum? Çözüm 1 için problemleri atlatmanın bir yolu var mı, yoksa çalışma zamanı tipinin yaydığı hardcore kökü ile gitmek daha mı iyi olurdu?

+1

json.net Ben ilk seçenek ilkesine aykırıdır sanmıyorum çözümü 1. –

+0

kullanır? Yaparlarsa hayret duyarım! –

+0

Gerçekten buraya uyup uymadığından emin olun, hatta burada bir sorun varsa, ancak montaj yönlendirmesi bazı akorları engeller mi? –

cevap

2

İçindeki eksik öğelerle başka bir özel toplantı hakkında düşündünüz mü? Sonra bir tür/yöntem varsa (bu yalnızca .net 4.5'te var olur) sınayın ve eğer varsa, derleme işlemini yükleyin.

Aynı şekilde, aynı yöntemleri ve sınıfları da koruyabilir ve kendinizi acıdan koruyabilirsiniz. Bu çılgın yayının hepsini yapmanın (kendinizi bu kadar çok şey bulursanız alacağınız mükemmel vuruştan bahsetmemek).

+0

Aslında bu gerçekten iyi bir fikir. Bunun tek dezavantajı fazladan bir mecraya sahip olmaktır, fakat bu montajı bir kaynağa bile yerleştirebilirim (kötü bir sırıtış). – Steven

+0

Sanırım bir kaynakta onu koymak için daha güvenli bir yer olabilir. – jbtule

+0

@jbtule, Bir kaynağa derleme yükleme güzel olsa da, imzalı meclisleri kullanırken, bu derlemeler arasında bir bağımlılık döngüsü olduğundan, bunu yapmak son derece zordur. Çekirdek, bu yeni meclisten önce inşa edilmelidir (çünkü çekirdeğe bağlı olduğu için), ancak çekirdeğin bu topluluğu kaynağında saklaması gerekir. Sorunu görüyor musun? – Steven

0

Dynamitey adlı bir projem var. Bu, çalışma zamanında bir tür yüklemenizi ve DLR ile statik yöntemleri ve yapıcıları çağırmanızı sağlar. Mutlaka mevcut olmayan bir api yüklemek için çok fazla yansıma veya kod yayan koddan çok daha az dağınıklık olurdu.

dynamic bigIntType = new DynamicObjects.LateType("System.Numerics.BigInteger, System.Numerics, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"); 

if (bigIntType.IsAvailable) 
{ 

    var one = [email protected](1); 
    var two = [email protected](2); 

    Assert.IsFalse(one.IsEven); 
    Assert.AreEqual(true, two.IsEven); 

    var tParsed = bigIntType.Parse("4"); 

    Assert.AreEqual(true, tParsed.IsEven); 
} 

Ben de ördek çağrılabilir maç o (aynı zamanda DLR kullanır) o nesnelerin etrafındaki arayüzleri için vekil türlerini yayacaktır ImpromptuInterface adlı bir proje var.neden benim üçüncü parti referansları böyle tecavüz edilmesi beklenir:

var targetType =Type.GetType("System.Collections.Generic.IReadOnlyList`1[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"); 

var list = new List<string>{"lala", "la","lala"}; 
object readonlyList; 
if(targetType != null){ 
    readonlyList = Impromptu.DynamicActLike(list, targetType); 
} 
+0

İlginç bir araç, ancak benim projem için, herhangi bir dış kütüphaneyi içeri sürüklemek istemiyorum. – Steven

+0

Evet Bir gömülü kaynağından bir derleme yüklemek sizin durumunuzda daha iyi bir çözümdür. – jbtule

İlgili konular