【问题标题】:Use MSBuild to build ASP.Net project targeting .Net 4.0 on Server 2016使用 MSBuild 在 Server 2016 上构建面向 .Net 4.0 的 ASP.Net 项目
【发布时间】:2018-01-26 13:09:30
【问题描述】:

我在 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。

所以我在谷歌上搜索了几个网站,上面写着'.NET Framework 4.5.2 is considered to be an "in-place update" to the .NET 4 family, with no need to recompile applications',我想也许我可以安装 .Net 4.5.2 定位包并使用 MSBuild 的这个参数来定位它们:

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

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

问题

  • 我所做的有什么问题吗?
  • 有没有更好的方法来做到这一点?

更新

我没有提到我还尝试通过this link 安装 .Net Framework 4.0.3 milti-targeting 包,但我收到以下错误:

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

【问题讨论】:

    标签: .net windows msbuild .net-4.0 windows-server-2016


    【解决方案1】:

    简答

    我不建议您继续使用 FrameworkPathOverride。这将更改您的应用程序编译为好像它是 .NET 4.5.2,而不是 4.0。会有意想不到的后果。

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

    或者,您可以通过在“Individual Components”中选择它来下载带有 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>
    

    如果你使用的是 VS 2017 的“新”、更纤薄的 csproj,那将是

       <PropertyGroup>
          <TargetFramework>net452</TargetFramework>
       </PropertyGroup>
    

    【讨论】:

    • 谢谢,我忘了提到我曾尝试在您之前提供的链接上安装 .Net 4.0 目标包并收到错误(不记得它说了什么 - 我会在重现时更新我的​​问题错误)。使用 Visual Studio 2017 安装程序安装单个组件是最终奏效的方法。我认为计划是最终将项目更新到更新的 .Net 版本,但现在我必须使用 4.0。
    • 安装单个组件也对我有用
    猜你喜欢
    • 1970-01-01
    • 2019-09-28
    • 2014-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-16
    • 1970-01-01
    相关资源
    最近更新 更多