通过Visual Studio 2010针对.NET Framework 4.5进行目标设置。

171

今天我在我的机器上安装了.NET Framework 4.5,希望可以从Visual Studio 2010中使用它,因为它只是一个次要更新,不应该对Visual Studio 2010造成问题。不幸的是,即使手动删除某些4.0版本并添加相应的4.5版本组件,项目仍会引用原始的4.0版本组件。

是否可以从Visual Studio 2010中针对版本4.5进行目标设置?如果可以,该如何设置?我真的很想使用功能区...


你必须升级到Visual Studio 2012以支持.NET v4.5。 - Arran
当我尝试在VS 2010控制台应用程序中使用System.Threading.Tasks.Task.Run()方法时,我了解到了这个限制。如果您的项目针对.Net Framework 4.0,则此方法不会显示在Task类上,然后您意识到如果您想要,VS2010无法针对.Net Framework 4.5进行目标设置。 - RBT
6个回答

197

每个版本的Visual Studio在Visual Studio 2010之前都与特定的.NET框架绑定。(VS2008是.NET 3.5,VS2005是.NET 2.0,VS2003是.NET1.1) Visual Studio 2010及以上版本允许针对先前的框架版本进行目标设置,但不能用于未来的发布。您必须使用Visual Studio 2012才能利用.NET 4.5。


9
并非完全正确-- .NET 3.0在VS版本之间发布,可以在VS2005中使用。 - Sly Gryphon
9
真是个进退两难的问题:为了利用 .NET 4.5 的好处,需要迁移到 VS2012+,但这样会失去喜爱的 VS2010 设置项目,无法再使用它来部署 MSI 安装程序……所谓“升级”更像是一种平级。 - ecoe
6
@ecoe - 有一个适用于VS 2013的扩展程序,可以恢复“安装和部署”项目类型:https://visualstudiogallery.msdn.microsoft.com/9abe329c-9bba-44a1-be59-0fbf6151054d - ajawad987
2
这是不正确的。您无需升级即可使用此功能。您需要做的就是添加一个新引用,然后浏览到.NET 4.5文件夹: C:\ Program Files(x86)\ Reference Assemblies \ Microsoft \ Framework \.Net Framework \ 4.5。您会在其中找到参考资料。只需添加它,它就可以工作了。 - Hermes Trismegistus
2
@HermesTrismegistus 在VS 2010中,我点击“目标框架=安装其他框架”,然后它会将我带到一个网站https://www.microsoft.com/net/download/visual-studio-sdks,但是它不让我导航到任何文件夹。我该怎么办?我必须能够从VS 2010中选择4.5版本。谢谢。 - Echeban
显示剩余5条评论

69

我能想到的使用场景非常有限,但是假设你无法获得购买VS2012等工具的资金。如果是这种情况,并且你拥有Windows 7+和VS 2010,你可以尝试使用我编写的以下方法进行操作,该方法似乎可以正常工作(但我还没有完全使用这种方法部署应用程序)。

  1. 备份你的项目文件!!!

  2. 下载并安装Windows 8 SDK,其中包括.NET 4.5 SDK。

  3. 在VS2010中打开您的项目。

  4. 在您的项目中创建名为Compile_4_5_CSharp.targets的文本文件,并将以下内容添加到其中。(或者只需从此处下载 - 确保从文件名中删除“.txt”扩展名):

<Project DefaultTargets="Build"
 xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

    <!-- Change the target framework to 4.5 if using the ".NET 4.5" configuration -->
    <PropertyGroup Condition=" '$(Platform)' == '.NET 4.5' ">
        <DefineConstants Condition="'$(DefineConstants)'==''">
            TARGETTING_FX_4_5
        </DefineConstants>
        <DefineConstants Condition="'$(DefineConstants)'!='' and '$(DefineConstants)'!='TARGETTING_FX_4_5'">
            $(DefineConstants);TARGETTING_FX_4_5
        </DefineConstants>
        <PlatformTarget Condition="'$(PlatformTarget)'!=''"/>
        <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
    </PropertyGroup>

    <!-- Import the standard C# targets -->
    <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />

    <!-- Add .NET 4.5 as an available platform -->
    <PropertyGroup>
       <AvailablePlatforms>$(AvailablePlatforms),.NET 4.5</AvailablePlatforms>
    </PropertyGroup>
</Project>
  • 卸载你的项目(右键->卸载)。

  • 编辑项目文件(右键->编辑*.csproj)。

  • 在项目文件中进行以下更改:

    a. 将默认的Microsoft.CSharp.targets替换为第4步创建的目标文件

  • <!-- Old Import Entry -->
    <!-- <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> -->
    
    <!-- New Import Entry -->
    <Import Project="Compile_4_5_CSharp.targets" />
    

    b. 将默认平台更改为.NET 4.5

    <!-- Old default platform entry -->
    <!-- <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> -->
    
    <!-- New default platform entry -->
    <Platform Condition=" '$(Platform)' == '' ">.NET 4.5</Platform>
    

    在项目属性中指定其他框架时,添加AnyCPU平台。此项应该在文件中的第一个<ItemGroup>标记之前添加。

    <PropertyGroup Condition="'$(Platform)' == 'AnyCPU'">
        <PlatformTarget>AnyCPU</PlatformTarget>
    </PropertyGroup>
    
    .
    .
    .
    <ItemGroup>
    .
    .
    .
    
  • 保存更改并关闭*.csproj文件。

  • 重新加载项目(右键单击->重新加载项目)。

  • 在配置管理器中(生成->配置管理器),确保为您的项目选择了“.NET 4.5”平台。

  • 仍在配置管理器中,为“.NET 4.5”创建一个新的解决方案平台(可以基于“任意 CPU”),并确保选择了“ .NET 4.5 ”作为解决方案。

  • 构建项目并检查是否有错误。

  • 假设构建已完成,您可以通过向源代码添加对于4.5特定类的引用来验证您确实正在针对4.5进行目标定位:

  • using System;
    using System.Text;
    
    namespace testing
    {
        using net45check = System.Reflection.ReflectionContext;
    }
    
    当您使用“.NET 4.5”平台进行编译时,构建应该成功。当您在“Any CPU”平台下编译时,您应该会收到编译器错误:
    Error 6: The type or namespace name 'ReflectionContext' does not exist in
    the namespace 'System.Reflection' (are you missing an assembly reference?)
    

    3
    这很疯狂,即使它能够正常工作,UI元素(如功能区设计器)是否会在大量的XAML和其他错误的情况下工作?认真考虑升级吧。 - Anonymous Type
    1
    除了David Woodward的回答,我还添加了<OutputPath>bin\</OutputPath>到第一个PropertyGroup中,但是出现了以下错误:项目“项目名称”的OutputPath属性未设置。 - mparkuk
    这确实有效。但我只是在安装.NET Framework 4.5.1后使用它,以便我可以继续在VS2010上运行Moles。 - Conrad Clark
    1
    我无法弄清如何成功完成第11步“...创建新的解决方案平台...”,但我发现如果忽略第11步,整个指令还是成功的。 - Tony Pulokas

    8

    提示:如果您想在VS2010中创建安装程序包,不幸的是它只支持.NET 4。为了解决这个问题,您需要将.NET 4.5添加为启动条件。

    请在安装程序的启动条件中添加以下内容(右键单击查看,启动条件)。

    在"搜索目标机器"中,右键单击并选择"添加注册表搜索"。

    Property: REGISTRYVALUE1
    RegKey: Software\Microsoft\NET Framework Setup\NDP\v4\Full
    Root: vsdrrHKLM
    Value: Release
    

    添加新的“启动条件”:
    Condition: REGISTRYVALUE1>="#378389"
    InstallUrl: http://www.microsoft.com/en-gb/download/details.aspx?id=30653
    Message: Setup requires .NET Framework 4.5 to be installed.
    

    何时使用:

    378389 = .NET Framework 4.5

    378675 = 安装在Windows 8.1上的.NET Framework 4.5.1

    378758 = 安装在Windows 8、Windows 7 SP1或Windows Vista SP2上的.NET Framework 4.5.1

    379893 = .NET Framework 4.5.2

    启动条件参考:http://msdn.microsoft.com/en-us/library/vstudio/xxyh2e6a(v=vs.100).aspx


    3

    我一直在苦恼VS2010/DNFW 4.5的整合问题,但终于解决了。从VS 2008开始,Visual Studio引入了一个用于缓存程序集的“引用程序集”文件缓存。这个文件缓存对于VS 2010而言位于\Reference Assemblies\Microsoft\Framework.NetFramework\v4.0。与从框架安装目录加载框架程序集不同,Visual Studio从此位置加载框架程序集。当微软表示VS 2010不支持DNFW 4.5时,他们实际上是指该目录没有在安装DNFW 4.5时进行更新。一旦您使用更新后的DNFW 4.5文件替换此位置中的文件,您将发现VS 2010能够轻松地使用DNFW 4.5。


    2

    来自另一个搜索结果。对我有用!

    "您可以使用Visual Studio 2010,并且它支持它,前提是您的操作系统支持.NET 4.5。

    右键单击解决方案以添加引用(与您通常做的方式相同)。当对话框出现时,请选择浏览,然后导航到以下文件夹:

    C:\Program Files(x86)\Reference Assemblies\Microsoft\Framework\.Net Framework\4.5

    您将在那里找到它。"


    7
    在句子“你会在那里找到它”中,“它”是什么?我们要选择那个文件夹中的哪个文件?它们中的一个能让我们在 VS 2010 中定位到 .net 4.5 吗? - Jeff Roe
    你会找到命名空间程序集。你可以添加任何一个你想要的。例如,我需要使用一个处理ZIP文件的方法。所以我找到了dll文件“System.IO.Compression.dll”,并将其添加到我的项目中。然后我可以在我的代码中明确列出命名空间,并使用我需要的方法。 - Hermes Trismegistus
    2
    这对我不起作用。如果您删除对System的引用,然后浏览到.Net 4.5 System.dll并将其添加为引用,则VS仍会选择4.0 System.dll。本页上Capt Nasty的答案对我有效,例如从C:\ Program Files(x86)\ Reference Assemblies \ Microsoft \ Framework \ .NETFramework \ v4.6复制System.dll,然后将其放在C:\ Program Files(x86)\ Reference Assemblies \ Microsoft \ Framework \ .NETFramework \ v4.0的System.dll上方。请注意,这是一种恶劣的黑客行为,可能会产生意想不到的后果。 - Jinlye

    0
    作为David Woodward答案的类似替代方案,您可以:
    1. 在项目文件夹中添加一个名为MyProject.csproj.user的文件,并将以下内容复制到其中。

    <?xml version="1.0" encoding="utf-8"?>
    <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
        <PropertyGroup>
            <!-- choose the fx target framework sub version, here 4.5.2 -->
            <FrameworkVersion4FX>5</FrameworkVersion4FX>
            <FrameworkVersion4FXX Condition="$(FrameworkVersion4FX) != ''">2</FrameworkVersion4FXX>
            <TargetFrameworkVersionNET4FX>v4</TargetFrameworkVersionNET4FX>
            <TargetFrameworkVersionNET4FX Condition="$(FrameworkVersion4FX) != '' ">$(TargetFrameworkVersionNET4FX).$(FrameworkVersion4FX)</TargetFrameworkVersionNET4FX>
            <TargetFrameworkVersionNET4FX Condition="$(FrameworkVersion4FXX) != '' ">$(TargetFrameworkVersionNET4FX).$(FrameworkVersion4FXX)</TargetFrameworkVersionNET4FX>
        </PropertyGroup>
    
        <PropertyGroup Condition="'$(Configuration)' == 'DebugNET4FX'">
            <TargetFrameworkVersion>$(TargetFrameworkVersionNET4FX)</TargetFrameworkVersion>
        </PropertyGroup>
    
        <PropertyGroup Condition="'$(Configuration)' == 'ReleaseNET4FX'">
            <TargetFrameworkVersion>$(TargetFrameworkVersionNET4FX)</TargetFrameworkVersion>
        </PropertyGroup>
    </Project>

    重新加载项目 打开配置管理器 现在在项目的下拉列表中出现了DebugNET4FX和ReleaseNET4FX配置项 通过点击"",选择并"Remove"两个新配置项来删除它们 点击"",在"New Project Configuration"窗口中通过输入正确的名称、选择适当的"Copy settings from"并勾选"Create new solution configurations"来重新添加它们 确保解决方案和项目的所有配置|平台相互匹配,并勾选"Build"框 启动项目 现在可以在解决方案下拉列表中选择所需的配置|平台组合。

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接