使用 MSBuild 在 Server 2016 上构建面向 .Net 4.0 的 ASP.Net 项目

Jas*_*oyd 2 .net windows msbuild .net-4.0 windows-server-2016

我在 Windows Server 2016 上设置了 Jenkins 构建服务器。我安装了“Visual Studio 2017 构建工具”(MSBuild 的最新版本)。当我尝试构建针对 .Net 4.0 的项目时,我收到以下错误消息:

C:\ Program Files(x86)\ Microsoft Visual Studio \ 2017 \ BuildTools \ MSBuild \ 15.0 \ Bin \ Microsoft.Common.CurrentVersion.targets(1122,5):错误MSB3644:框架“.NETFramework,Version =”的参考程序集v4.0”未找到。要解决此问题,请安装此框架版本的 SDK 或 Targeting Pack,或者将您的应用程序重新定位到已安装 SDK 或 Targeting Pack 的框架版本。请注意,程序集将从全局程序集缓存 (GAC) 中解析,并将用于代替引用程序集。因此,您的程序集可能无法正确定位您想要的框架。

于是我检查了'C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.0',发现这个文件夹里果然没有dll,只有xml文件。

因此,我尝试安装完整的 .Net 4.0 框架,认为将安装参考程序集,但我收到以下消息:

1) Microsoft .NET Framework 4 已经是该操作系统的一部分。您不需要安装 .NET Framework 4 可再发行组件。

2) 此计算机上已安装相同或更高版本的.NET Framework 4。

因此,我在 Google 上搜索并找到了几个网站,上面写着“.NET Framework 4.5.2 被认为是 .NET 4 系列的“就地更新”,无需重新编译应用程序”,我想也许我可以只需安装 .Net 4.5.2 目标包并使用 MSBuild 的此参数来定位它们:

/property:FrameworkPathOverride="C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.2"
Run Code Online (Sandbox Code Playgroud)

果然,这似乎有效。问题是我不完全理解参考程序集和目标包等等。我担心,虽然看起来我可能已经解决了这个问题,但稍后我会发现,在更远的地方,我引入了一些其他令人讨厌的问题。

问题

  • 我所做的事情有什么问题吗?
  • 有更好的方法来做这件事吗?

更新

我没有提到我还尝试通过此链接安装 .Net Framework 4.0.3 milti-targeting 包,但出现以下错误:

未找到 Microsoft .NET Framework 4 多目标包。请修复您的 Microsoft Visual Studio 2010 安装才能获取此更新。

nat*_*ter 5

简短回答

我不建议您继续使用 FrameworkPathOverride。这会将您的应用程序更改为像 .NET 4.5.2 而不是 4.0 一样进行编译。将会产生意想不到的后果。

您可以在此处下载 .NET Framework 4.0 目标包:https://www.microsoft.com/en-us/download/details.aspx ?id=29052

或者,您可以通过在“单独组件”中选择 Visual Studio 2017 安装程序来下载 .NET 4.0 目标包。

与安装程序

更多细节

问题是我不完全理解参考程序集和目标包等等。

“参考程序集”基本上类似于 .NET 中的头文件。当您为 .NET Framework 4.0 编译应用程序时,您将“定位”.NET 4.0 运行时中可用的 API。这形成了您的应用程序可以运行的最低运行时版本。但是,应用程序将在计算机上安装的 .NET Framework 运行时版本(它是全局共享版本)上执行,该版本几乎肯定会比 4.0 更新。

安装目标包仅意味着您正在将“头文件”的副本安装到您​​的计算机上。您的计算机仍将安装 .NET Framework 4.5.x 或 4.6 运行时。

由于 .NET 4.0 不再受支持,并且大多数计算机都具有 4.5.2 或更高版本,因此您应该考虑针对 .NET Framework 4.5.2 进行编译。您可以从 Visual Studio 中的项目属性页面执行此操作。或者,您可以编辑 csproj 文件。

如果您使用“经典”、更详细的 csproj 格式,那就像这样

   <PropertyGroup>
      <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>
   </PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

如果您使用 VS 2017 的“新”、更精简的 csproj,那就是

   <PropertyGroup>
      <TargetFramework>net452</TargetFramework>
   </PropertyGroup>
Run Code Online (Sandbox Code Playgroud)