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

时间:2010-12-06 19:51:16

标签: c# .net assemblies compatibility 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:好的,想通了,但它比这里的海报似乎要复杂得多。我正在打开一个不同的问题来讨论错综复杂的问题,但简短的版本是,如果你想在.NET 4上运行非.NET 4程序集,你需要一个带有<supportedRuntime version="v4.0" />的app.config。他们赢了没有它就加载。

4 个答案:

答案 0 :(得分:22)

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

要回答您的具体问题,您可以使用以下基本程序执行您想要的操作:

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

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

答案 1 :(得分:2)

.NET是向后兼容的,这意味着如果您选择.NET Framework 2.0作为目标框架,它将在已安装的版本2.0,3.0,3.5和4.0上运行。 但是,如果您选择例如4.0版作为目标框架,则只有在安装了4.0版本时才会运行。

答案 2 :(得分:0)

相信这应该是你选择和向上的任何版本。因此,如果您定位2.0框架,它应该可以工作,如果客户端安装了2.0,3.0,3.5或4.0框架。

当你选择这个时,你也在选择语言功能,所以我知道你无法使用面向2.0框架的应用程序来使用4.0框架功能。即使动态加载程序集也不起作用,尝试从2.0应用程序加载编译为4.0的DLL,它不会让你。

答案 3 :(得分:0)

以下是定位的工作原理:如果您定位.NET 3.5,如果用户没有.NET 3.5,它将无法运行。如果用户有更高版本,它将运行。

为了获得最大的兼容性,请选择.NET 2.0,它甚至可以在.NET 3.5,4.0等上运行。

但是,您可能会忽略.NET的新功能,例如LINQ等。

http://msdn.microsoft.com/en-us/library/bb398197(VS.100).aspx

Can I still target .NET Framework 2.0 in VisualStudio 2010?