Visual Studio VS 2022中打开.net framework 4. 5项目,有什么变通办法吗?

zlwx9yxi  于 2023-01-05  发布在  .NET
关注(0)|答案(7)|浏览(366)

有没有办法打开并在visual studio 2022中处理.net framework 4.5项目。
问题可能不是VS2022,而是由于.net framework 4.5开发包不再可用。我的项目不能更改目标版本。是否有任何变通办法?
第一节第一节第一节第一节第一次

bf1o4zei

bf1o4zei1#

有关详细信息:Building a project that target .NET Framework 4.5 in Visual Studio 2022

vddsk6oq

vddsk6oq2#

虽然所有建议的,甚至是被接受的解决方案都将奏效,但没有一个是"首选"的方法。
您需要做的唯一一件事就是添加对NuGet包的引用,如下所示:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net40</TargetFramework>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.NETFramework.ReferenceAssemblies.net40" Version="1.0.2">
      <PrivateAssets>all</PrivateAssets>
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
    </PackageReference>
  </ItemGroup>
</Project>
  • 图1:通过引用程序集面向. NET Framework 4.0的C#项目 *

您可以直接在*.csproj中或通过Visual Studio中的 * 包管理器 * UI进行此更改。包中的MSBuild扩展将处理其余的 * magic *。不需要编写脚本、复制文件或授予权限。这将在没有提升的情况下工作,而在%PROGRAMFILES%下编写时需要提升。
设置PrivateAssets="All"将使包仅引用设计时。如果您的目标也生成NuGet包,则不会将其作为可传递依赖项拾取或包括在内。

  • 图2:Visual Studio 2022解决方案资源管理器中面向. NET Framework 4.0的项目 *

罗斯林第56161期:删除. NET 4.5目标包要求进一步确认了在未安装目标包的情况下如何使用引用程序集。此方法在您不想安装目标包或目标包因其他原因不可用(例如在没有Visual Studio的生成服务器上)时非常有用。

证据

  • 图3:未安装或未提供较旧的. NET目标软件包 *

我在卸载Visual Studio 2019后遇到了同样的问题。添加此包引用后,构建从Visual Studio和CLI按预期工作。

示例

1.将文件从.NET 4.0 Console using VS2022 Gist下载到任意文件夹
1.打开开发人员提示并导航到目标文件夹
1.执行dotnet restore
1.在Visual Studio 2022中打开项目
1.生成并运行项目

附加信息

  • 使用dotnetmsbuild从命令行构建应该没有错误和警告
  • 必须安装目标. NETFramework版本才能构建它,但必须运行它;包括单元测试
  • 您 * 可能 * 需要运行清理和/或手动删除binobj,可能还需要删除.vs,以清除最初的Visual Studio警告
  • 您 * 可能 * 需要执行显式NuGet恢复(例如:dotnet restore)清除初始Visual Studio警告
  • Visual Studio似乎要求安装目标. NET Framework
  • 所示示例针对安装了. NET Framework 4.8的. NET Framework 4.0
  • 目标是通过命令行编译的. NET Framework 2.0或3.5,而不是Visual Studio,可能是因为我没有安装它们
  • 如果Visual Studio仍然让您感到悲伤:
  • 添加至少一个受支持的目标框架名字对象(例如:1米10分1秒)
  • 使用Visual Studio代码(我更喜欢完整的VS,但这是一个选项)
6yjfywim

6yjfywim3#

下面是一个自动化解决方案,它遵循此答案中的步骤:https://stackoverflow.com/a/70109092/569302复制文件时,可能会出现一个对话框,您必须单击该对话框才能替换已存在的文件
注:如果有更新的NuGet package,您可能需要将"1.0.2" "版本"更新为最新版本)
运行await DevHelpers.Download();

using Microsoft.VisualBasic.FileIO;
using System;
using System.Collections.Generic;
using System.IO.Compression;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;

namespace j.Dev
{
    public class DevHelpers
    {
        public static async Task Download()
        {
            var version = "1.0.2";
            var name = "Framework45-" + DateTimeToFileString(DateTime.Now);
            var fileName = $"{name}.zip";
            var url = $"https://www.nuget.org/api/v2/package/Microsoft.NETFramework.ReferenceAssemblies.net45/{version}";
            await DownloadFile(fileName, url);
            ZipFile.ExtractToDirectory(fileName, name);
            var from = Path.Join(name, @"build\.NETFramework\v4.5\");
            var to = @"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5";
            FileSystem.CopyDirectory(from, to, UIOption.AllDialogs);
        }

        private static string DateTimeToFileString(DateTime d)
        {
            return d.ToString("yyyy-dd-M--HH-mm-ss");
        }

        private static async Task DownloadFile(string fileName, string url)
        {
            var uri = new Uri(url);
            HttpClient client = new HttpClient();
            var response = await client.GetAsync(uri);
            using (var fs = new FileStream(
                fileName,
                FileMode.CreateNew))
            {
                await response.Content.CopyToAsync(fs);
            }
        }
    }
}

在我的例子中,我需要下载4.0和4.5,所以下面是同时下载4.0和4.5的代码:

using Microsoft.VisualBasic.FileIO;
using System.IO.Compression;

namespace j.Dev
{
    /// <summary>
    /// Example Usage: await DevHelpers.DownloadAndCopyFramework4_0And4_5();
    /// </summary>
    public class DevHelpers
    {
        public static async Task DownloadAndCopyFramework4_0And4_5()
        {
            await DownloadAndCopyFramework4_0();
            await DownloadAndCopyFramework4_5();
        }

        public static async Task DownloadAndCopyFramework4_5()
        {
            await DownloadAndCopyFrameworkGeneric("net45", "v4.5", "1.0.2");
        }

        public static async Task DownloadAndCopyFramework4_0()
        {
            await DownloadAndCopyFrameworkGeneric("net40", "v4.0", "1.0.2");
        }

        public static async Task DownloadAndCopyFrameworkGeneric(string netVersion, string folder, string nugetVersion)
        {
            var name = netVersion + "-" + DateTimeToFileString(DateTime.Now);
            var fileName = $"{name}.zip";
            var url = $"https://www.nuget.org/api/v2/package/Microsoft.NETFramework.ReferenceAssemblies.{netVersion}/{nugetVersion}";
            await DownloadFile(fileName, url);
            ZipFile.ExtractToDirectory(fileName, name);
            var from = Path.Join(name, @"build\.NETFramework\" + folder);
            var to = @"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\" + folder;
            FileSystem.CopyDirectory(from, to, UIOption.AllDialogs);
        }

        private static string DateTimeToFileString(DateTime d)
        {
            return d.ToString("yyyy-dd-M--HH-mm-ss");
        }

        private static async Task DownloadFile(string fileName, string url)
        {
            var uri = new Uri(url);
            HttpClient client = new HttpClient();
            var response = await client.GetAsync(uri);
            using (var fs = new FileStream(
                fileName,
                FileMode.CreateNew))
            {
                await response.Content.CopyToAsync(fs);
            }
        }
    }
}
wlzqhblo

wlzqhblo4#

另一种安装 * 多个 * 较旧的目标包的方法是安装Visual Studio 2019。
注意:如果你卸载VS2019,它会再次删除它们,所以复制一份你想要的,然后粘贴回来。

ulydmbyx

ulydmbyx5#

从关于复制文件的答案链接的文章的评论:安装“Windows 8 SDK”。而且它只能安装“.Net Framework 4. 5软件开发工具包”。没有其他包袱。
这个选项对我来说是最快的,因为我可以运行一个提升的安装程序比切换到提升的写入程序文件夹更容易。

332nm8kg

332nm8kg6#

对于.NET 4.0,如果您缓存了Visual Studio 2019文件,此命令将为您安装:

msiexec.exe /i "%ALLUSERSPROFILE%\Microsoft\VisualStudio\Packages\Microsoft.Net.4.TargetingPack,version=4.0.30319.1\netfx_dtp.msi" EXTUI=1

对于.NET 4.5,这可能可行,尽管我还没有尝试过:

msiexec.exe /i "%ALLUSERSPROFILE%\Microsoft\VisualStudio\Packages\Microsoft.Net.4.5.2.TargetingPack,version=4.5.51651.1\netfx_452mtpack.msi" EXTUI=1
zpqajqem

zpqajqem7#

我在VS2022 Windows 11中的一个项目中遇到了这个问题,该项目同时针对.NET Framework 4.5.2和.NET 6,我通过直接从Microsoft下载开发者包修复了这个问题。
我使用了编译器错误提示的链接:https://aka.ms/msbuild/developerpacks,在“不支持的版本”部分找到了4.5.2。它在一个折叠的窗格中,因此您必须单击“不支持”元素。
直接链接:https://dotnet.microsoft.com/en-us/download/dotnet-framework/thank-you/net452-developer-pack-offline-installer

相关问题