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);
}
}
}
}
7条答案
按热度按时间bf1o4zei1#
build\.NETFramework\v4.5\
复制到C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5
有关详细信息:Building a project that target .NET Framework 4.5 in Visual Studio 2022
vddsk6oq2#
虽然所有建议的,甚至是被接受的解决方案都将奏效,但没有一个是"首选"的方法。
您需要做的唯一一件事就是添加对NuGet包的引用,如下所示:
您可以直接在
*.csproj
中或通过Visual Studio中的 * 包管理器 * UI进行此更改。包中的MSBuild扩展将处理其余的 * magic *。不需要编写脚本、复制文件或授予权限。这将在没有提升的情况下工作,而在%PROGRAMFILES%
下编写时需要提升。设置
PrivateAssets="All"
将使包仅引用设计时。如果您的目标也生成NuGet包,则不会将其作为可传递依赖项拾取或包括在内。罗斯林第56161期:删除. NET 4.5目标包要求进一步确认了在未安装目标包的情况下如何使用引用程序集。此方法在您不想安装目标包或目标包因其他原因不可用(例如在没有Visual Studio的生成服务器上)时非常有用。
证据
我在卸载Visual Studio 2019后遇到了同样的问题。添加此包引用后,构建从Visual Studio和CLI按预期工作。
示例
1.将文件从.NET 4.0 Console using VS2022 Gist下载到任意文件夹
1.打开开发人员提示并导航到目标文件夹
1.执行
dotnet restore
1.在Visual Studio 2022中打开项目
1.生成并运行项目
附加信息
dotnet
或msbuild
从命令行构建应该没有错误和警告bin
、obj
,可能还需要删除.vs
,以清除最初的Visual Studio警告dotnet restore
)清除初始Visual Studio警告6yjfywim3#
下面是一个自动化解决方案,它遵循此答案中的步骤:https://stackoverflow.com/a/70109092/569302复制文件时,可能会出现一个对话框,您必须单击该对话框才能替换已存在的文件
(注:如果有更新的NuGet package,您可能需要将
"1.0.2"
"版本"更新为最新版本)运行
await DevHelpers.Download();
在我的例子中,我需要下载4.0和4.5,所以下面是同时下载4.0和4.5的代码:
wlzqhblo4#
另一种安装 * 多个 * 较旧的目标包的方法是安装Visual Studio 2019。
注意:如果你卸载VS2019,它会再次删除它们,所以复制一份你想要的,然后粘贴回来。
ulydmbyx5#
从关于复制文件的答案链接的文章的评论:安装“Windows 8 SDK”。而且它只能安装“.Net Framework 4. 5软件开发工具包”。没有其他包袱。
这个选项对我来说是最快的,因为我可以运行一个提升的安装程序比切换到提升的写入程序文件夹更容易。
332nm8kg6#
对于.NET 4.0,如果您缓存了Visual Studio 2019文件,此命令将为您安装:
对于.NET 4.5,这可能可行,尽管我还没有尝试过:
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