Ste*_*ven 6 .net c# frameworks framework-design nuget
我正在创建一个我的玩具项目的新次要版本.该项目在NuGet上发布,与.NET 4.0及更高版本兼容.我正在介绍的一些新功能需要.NET 4.5(用户应该能够解析,IReadOnlyCollection<T>以及IReadOnlyList<T>.NET 4.5中引入的两个接口),但我需要保持项目与.NET 4.0兼容,因为不是所有的开发人员可以轻松迁移到最新的.NET框架.
所以我面临的问题是如何解决这个"前向兼容性"问题.我想到了两种解决方案,但两者都不是很有吸引力,所以希望任何人都可以在这里给我一些想法或指导.
以下是我提出的两个解决方案:
解决方案1:使用#if编译器指令并根据.NET框架版本构建DLL,并使用NuGet包发布这些版本并在项目站点下载.
这种方法的缺点是当开发人员将他们的Visual Studio项目从.NET 4.0更新到.NET 4.5时,他们不会自动获得.NET 4.5版本(具有.NET 4.5特定功能).这违反了最不惊讶的原则,并且当开发人员在几个月后尝试使用它时,会让开发人员对这个功能无效的原因感到茫然.
解决方案2:使用单个DLL并动态发出类型,当它们存在于当前应用程序域中时实现这两个新接口.这允许将单个DLL发送给用户,并允许在开发人员在其项目中切换.NET框架版本时提供功能.这将使事情'正常工作'.这是我目前正朝着顺便前进的方向.
因为我需要返回一个需要实现接口的类型,所以缺点是必须在运行时使用Reflection.Emit,ModuleBuilder,TypeBuilder等创建该类型.这是非常讨厌的shizzle.但除此之外,由于这种类型必须在一个新的(匿名)程序集中创建,我必须将一些内部类型设为public(它需要继承的类型和它需要实现的接口).使这些内部类型公开污染项目的API,并禁止我对这些类型进行更改.
我相信这些是我的选择,但我可能会遗漏一些明显的东西.所以我的问题是,我错过了一个可能性吗?有没有办法绕过解决方案1的问题,或者更好地使用运行时类型的硬核根发射?
您是否考虑过另一个带有缺失项目的定制组件?然后测试类型/方法是否存在(仅存在于 .net 4.5 中),如果存在,则加载程序集。
这样你就可以保持完全相同的方法和类,并且省去自己做所有疯狂发射的痛苦(更不用说如果你发现自己做了那么多,你将遭受的性能打击)。