定位框架真正意味着什么,以及如何最大化兼容性?

Pau*_*ano 42 .net c# compatibility assemblies backwards-compatibility

问候所有,

自从我第一次开始用C#编码以来,这让我很困惑.我的目标是创建一个程序集,该程序集将在用户拥有的最新.NET框架上运行,无论可能是什么.我不想要安装.NET 4,但是如果用户拥有它,我想使用它,更重要的是,如果用户只有 .NET 4而且下面没有任何内容,我希望它仍然有用.我开始怀疑这甚至不可能.

当我在Visual Studio中更改"目标框架"时,我真的不明白我在选择什么.这是否意味着"将与此版本兼容"?或者"只与这个版本兼容"?到目前为止似乎是后者; 我在虚拟机中的测试表明.NET 4目标程序集在没有.NET 4的情况下失败,而.NET 3.5目标程序集在没有.NET 3.5的情况下失败.有没有办法设置这个,所以我可以实现最大的兼容性?

更新:为了澄清,我有一个针对.NET 2的程序.这里的海报似乎表明它应该加载.NET 4.但是在只有.NET 4且之前没有任何东西的环境中,它无法加载.

UPDATE2:好的,想通了,但它比这里的海报似乎要复杂得多.我正在打开一个不同的问题来讨论错综复杂的问题,但简短的版本是,<supportedRuntime version="v4.0" />如果你想在.NET 4上运行非.NET 4程序集,你需要一个app.config .如果没有它,它们将无法加载.

Kei*_*thS 22

框架旨在向后兼容; 如果你有一个用.NET 2.0编写的程序,你可以在4.0运行时运行它,因为没有一个框架会删除先前版本的功能(这就是为什么我们仍然有像ArrayList这样的非泛型集合,即使他们被弃用以支持通用集合.但是,相反的情况并不一定如此; 4.0 app不能保证在2.0中运行,因为它可以利用新运行时的新功能,这些功能在以前的版本中是不可用的.在任何情况下,如果您希望您的应用程序尝试在没有专门定位的运行时版本上运行,则必须使用SupportedRuntime元素在app.config中指定该应用程序.

要回答您的具体问题,您可以使用以下基本步骤执行所需操作:

  • 开发您的应用程序以定位您想要支持的EARLIEST框架版本.这将禁止访问较新运行时的较新功能(如3.5中的Linq和4.0中的动态类型),确保您的应用程序不需要任何支持的运行时无法提供的任何功能.

  • 使用app.config文件中的SupportedRuntime元素指定应用程序可接受的框架.这将告诉本机代码初始化应用程序将在其中运行的运行时,如果找不到目标版本,则其他任何一个都是可接受的.我相信行为是首先寻找目标框架,如果不可用,它应该使用最新支持的运行时.

  • 如果新版本性能更好怎么办?我有一个可以与 .NET Framework 2.0 一起使用的库,但我认为由于多年来进行的优化,它在较新版本上的性能可能会更好。因此,我的目标是更新的版本 4.6.1。你如何看待这些情况? (2认同)