Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 以框架为目标到底意味着什么?如何最大限度地提高兼容性?_C#_.net_Assemblies_Compatibility_Backwards Compatibility - Fatal编程技术网

C# 以框架为目标到底意味着什么?如何最大限度地提高兼容性?

C# 以框架为目标到底意味着什么?如何最大限度地提高兼容性?,c#,.net,assemblies,compatibility,backwards-compatibility,C#,.net,Assemblies,Compatibility,Backwards Compatibility,大家好, 自从我第一次开始用C编写代码以来,这一直让我感到困惑。我的目标是创建一个程序集,该程序集将在用户拥有的最新.NET框架上运行,不管它是什么。我不想要求安装.NET 4,但如果用户拥有它,我想使用它,更重要的是,如果用户只有.NET 4,而下面没有任何内容,我希望它仍然可以工作。我开始怀疑这是不可能的 当我在VisualStudio中更改目标框架时,我真的不明白我在选择什么。这是否意味着将与此版本及更高版本兼容?或仅与此版本兼容?到目前为止,似乎是后者;我在虚拟机中的测试显示.NET 4

大家好,

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

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

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

更新2:好吧,我想出来了,但它比这里的海报想象的要复杂得多。我将打开一个不同的问题来讨论这些复杂的问题,但简短的版本是,如果您想在.NET 4上运行非.NET 4程序集,则需要在其中包含app.config。没有它它们就无法加载。

我相信这应该是您选择的任何版本。所以,若您以2.0框架为目标,那个么若客户机安装了2.0、3.0、3.5或4.0框架,那个么它应该可以工作


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

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

以下是目标定位的工作原理:如果您以.NET 3.5为目标,则如果用户没有.NET 3.5,它将不会运行。如果用户有任何更高版本,它将运行

为了获得最大的兼容性,请选择.NET2.0,它甚至可以在.NET3.5、4.0等平台上运行

然而,您可能会对.NET的新功能(如LINQ等)有所了解


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

要回答您的具体问题,您可以按照以下基本步骤进行操作:

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

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


我可以问一下,你想写什么,希望它尽可能使用最新的框架吗?在大多数情况下,坚持在尽可能早的框架中编写应用程序是可以接受的,否则您将资助自己针对特定框架进行编译,并尝试根据已安装的版本玩混搭游戏。这并不是说我真的希望尽可能使用最新的框架,我希望那些只安装了.NET4的用户不必下载并安装庞大的.NET3.5框架。这是我假设的,但事实似乎并非如此。我已经测试了我的应用程序,它是一个只安装了.NET4的虚拟机中的扩展DLL,并且没有加载。如果我尝试使用ngen,它会给我以下错误:加载运行时失败。HRES的例外情况
结果:0x80131700。程序集{my Assembly}需要运行运行时的v2.0.50727版本。如果较新版本的性能更好怎么办?我有一个可以与.NETFramework2.0一起使用的库,但我认为它在较新版本上的性能可能会更好,因为多年来进行了优化。因此,我的目标是更新的版本4.6.1。你对这种情况怎么看?