VS2022中的开放.net 框架4.5项目。有什么解决方案吗?

是否有任何打开和工作的 .net framework 4.5项目在 visual studio 2022

可能是问题不是 VS2022,但作为 .net framework 4.5开发包不再可用。.我的项目不能改变目标版本。.有什么解决办法吗?

enter image description here enter image description here

59743 次浏览
  • 从 nuget.org 下载 参考汇编.net45
  • Open the package as zip
  • 将文件从 build\.NETFramework\v4.5\复制到 C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5

详情请浏览: 在 Visual Studio 2022中生成以.NET Framework 4.5为目标的项目

这是一个自动化的解决方案。它遵循这个答案中的步骤: https://stackoverflow.com/a/70109092/569302当它复制文件时,可能会出现一个对话框,您必须单击以替换已经存在的文件

(注意: 如果有一个更新的 < a href = “ https://www.NuGet.org/package/microsoft.netframework.ReferenceAssemblies.net45”rel = “ nofollow noReferrer”> NuGet package ,您可能需要将“ version”"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);
}
}
}
}

对于.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

尽管所有提出的,甚至是已被接受的解决方案都将有效,但它们都不是 更喜欢方法。

您唯一需要做的就是添加对 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中进行此更改,也可以通过 VisualStudio 中的 包裹管理员UI 进行此更改。包中的 MSBuild 扩展将负责 magic的其余部分。没有要编写的脚本、要复制的文件或要授予的权限。这将工作没有抬高,这将需要在 %PROGRAMFILES%下写。

设置 PrivateAssets="All"将使包参考设计时间只。如果您的目标也构建了一个 NuGet 包,那么它将不会被拾取或包含为一个传递依赖项。

.NET 4.0 console in VS2022

图2: Visual Studio 2022解决方案资源管理器中针对.NET Framework 4.0的项目

Roslyn 问题56161: 删除.NET 4.5目标包需求进一步确认了在没有安装目标包时如何使用引用程序集。这种方法在您不想安装目标包或者在其他情况下不可用时非常有用——比如在没有 VisualStudio 的生成服务器上。

The Proof

.NET Targeting Packs

图3: 未安装或不可用的旧.NET 目标包

卸载 VisualStudio2019之后,我遇到了同样的问题。在添加此包引用之后,该生成在 VisualStudio 和 CLI 中正常工作。

例子

  1. Download the files from the 使用 VS2022的.NET 4.0控制台 Gist to any folder
  2. Open a developer prompt and navigate to the target folder
  3. 执行 dotnet restore
  4. 在 VisualStudio2022中打开项目
  5. 生成并运行项目

其他资料

  • Building from the command-line with dotnet or msbuild should be error and warning free
  • 你做 没有必须有目标。NET Framework 版本安装来生成它,但是您需要运行它; 包括单元测试
  • 您需要运行 干净和/或手动删除 binobj,可能还有 .vs,以清除初始 VisualStudio 警告
  • 您需要执行显式的 NuGet 恢复(例如: dotnet restore)来清除初始 VisualStudio 警告
  • VisualStudio 似乎要求安装目标.NETFramework
  • 示例显示了安装了.NET Framework 4.8的目标.NET Framework 4.0
  • 目标.NET Framework 2.0或3.5通过命令行编译,但不是 Visual Studio,可能是因为我没有安装它们
  • If Visual Studio is still giving you grief:
    • 添加至少一个受支持的目标框架名字对象(例如: net48)
    • 使用 VisualStudio 代码(我更喜欢完整的 VS,但它是一个选项)

另一种安装 多个旧的目标包的方法是安装 VisualStudio2019。

注意: 如果你卸载 VS2019,它会再次删除它们,所以拿一份你想要的拷贝,然后粘贴回去。

enter image description here

从文章的评论中链接到关于复制文件的答案: “安装 Windows8SDK”。而且它只需要安装4.5软件开发工具包的.net Framework”。没有其他包袱”

这个选项对我来说是最快的,因为我可以运行一个升级的安装程序,比切换到升级到写程序文件夹更容易。

enter image description here