关于c#:定位框架的真正含义是什么?如何最大限度地提高兼容性?

What does it really mean to target a framework, and how do I maximize 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而且之前没有任何内容的环境中,它无法加载。

最新消息2:好吧,想清楚了,但比这里的海报想象的要复杂得多。我打开一个不同的问题来讨论这些复杂的问题,但简短的版本是,如果您想在.NET 4上运行非.NET 4程序集,则需要一个包含的app.config。没有它,他们就装不下。


框架的设计是向后兼容的;如果你有一个用.NET 2.0编写的程序,你可以在4.0运行时运行它,因为没有一个框架删除了以前版本的功能(这就是为什么我们仍然有像arraylist这样的非泛型集合,尽管它们被弃用以支持泛型集合s)。但是,反过来也不一定正确;4.0应用程序不能保证在2.0中运行,因为它可能会利用新运行时的新功能,而这些新功能在以前的版本中不可用。在任何情况下,如果您希望您的应用程序尝试在其未专门针对的运行时版本上运行,则必须使用supportedruntime元素在app.config中指定。

要回答您的特定问题,您可以使用以下基本过程来完成您想要的操作:

  • 开发你的应用程序以你想要支持的最早的框架版本为目标。这将禁止访问较新运行时的较新功能(如3.5中的linq和4.0中的动态键入),确保您的应用程序不需要任何受支持运行时无法提供的功能。

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


.NET是向后兼容的,这意味着如果选择.NET Framework 2.0作为目标框架,它将在已安装的版本2.0、3.0、3.5和4.0上运行。但是,如果选择4.0版作为目标框架,则只有在安装了4.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

我仍然可以在VisualStudio 2010中以.NET Framework 2.0为目标吗?


我相信这应该是你选择的任何版本。因此,如果您的目标是2.0框架,那么如果客户机安装了2.0、3.0、3.5或4.0框架,它就应该工作。

当你选择这个的时候,你也在选择语言特性,所以我不知道你能用一个针对2.0框架的应用程序来使用4.0框架特性。即使动态加载程序集也不起作用,请尝试从2.0应用程序加载编译为4.0的dll,它不会允许您这样做。