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?
json.net Ben ilk seçenek ilkesine aykırıdır sanmıyorum çözümü 1. –
kullanır? Yaparlarsa hayret duyarım! –
Gerçekten buraya uyup uymadığından emin olun, hatta burada bir sorun varsa, ancak montaj yönlendirmesi bazı akorları engeller mi? –