【问题标题】:Why is Visual Studio 2013 using the wrong SdkToolsPath for lc.exe?为什么 Visual Studio 2013 对 lc.exe 使用错误的 SdkToolsPath?
【发布时间】:2014-12-14 01:35:03
【问题描述】:

我正在使用带有 asp.net 项目的 Visual Studio 2013。其中一个项目给出了以下错误。 为什么它在错误的路径中寻找 LC.exe?我的 Windows 8.1 SDK 已安装,并且我在

处有一个 lc.exe
C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools

和一个 64 位版本,我在

有一个注册表项
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v8.1A

我正在查看C:\Windows\Microsoft.NET\Framework\v4.0.30319 下的 Microsoft.Common.targets,并且此密钥存在:SdkToolsPath="$(TargetFrameworkSDKToolsDirectory)"。然后查看了

下的Microsoft.NetFramework.CurrentVersion.props
C:\Program Files (x86)\MSBuild\12.0\Bin

TargetFrameworkSDKToolsDirectory 定义在$SDK40ToolsPath。根据MSBuild /v:diag

SDK40ToolsPath = C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools 

看起来不错。 .NET 4.0 中 VS 中的项目目标。

那么为什么它仍在查看错误的文件夹或注册表项?有趣的是,当我收到错误消息后重新构建项目时,项目构建正常。

Error   5   
Task could not find "LC.exe" using the SdkToolsPath 
    "C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin\NETFX 4.0 Tools\" 
or the registry key 
    "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v8.0A\WinSDK-NetFx40Tools-x86".
Make sure the SdkToolsPath is set and the tool exists in the correct processor 
specific location under the SdkToolsPath and that the Microsoft Windows SDK is 
installed   
    C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets  2428    5   SuperReports

【问题讨论】:

  • 它寻找正确的 SDK,而不是正确的子目录。它存储在 v7.0A\bin 中。很难猜测它最终是如何粘合“NETFX 4.0 工具”的。这可能只是一个 MSBuild 错误,许可证编译器并没有得到太多使用,并且由于 SDK 8.x 造成的剧变留下了很多伤痕。最简单的破解方法是自己创建子目录并将 lc.exe 复制到其中。一定要检查一下对 lc.exe 的需求,在 web 项目中使用它很奇怪。
  • 那行得通。你可以让它成为一个答案。
  • 我仍然认为它在错误消息中声称它正在查看 v7.0A 很奇怪。

标签: visual-studio visual-studio-2013 msbuild


【解决方案1】:

我采用了与上面 Hans Passant 建议的方法略有不同的方法。 我的场景是我的构建是通过 Jenkins(一个 CI 工具)在 Windows 2008 服务器中使用 MSBuild 2015 执行的。

根据文档,Microsoft SDK 10 不支持 Windows 2008。我尝试同时使用SdkToolsPathFrameworkOverride msbuild 命令行参数但没有成功(没有一起尝试,刚刚在打字时意识到)。

无论如何,可行的方法是,是的 - 我无法强制 msbuild 使用较新的 SDK 版本而不是 Windows 7 中的版本 (它坚持从C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\NETFX 4.0 Tools 获取LC.exe) - 所以我的黑客是用SDK 10 中的一个覆盖LC.exe(我已经安装在我的本地机器上,而不是在运行Windows 2008 的构建服务器中)。

我的构建终于成功了。

【讨论】:

  • 在互联网上尝试了所有其他选择之后,这是唯一对我有用的。我找不到强制 Windows Server 2008 上的 msbuild 使用 v10.0A\bin\NETFX 4.6.2 Tools\lc.exe 的方法。它只是一直引用 v8.1A NETFX 4.5.1。想知道一种简单地通过参数化 msbuild 来解决它的方法...
【解决方案2】:

原来你可以直接在.csproj文件中指定SDK的路径:

<TargetFrameworkSDKToolsDirectory>C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6 Tools</TargetFrameworkSDKToolsDirectory>

并且构建以这种方式找到了 lc.exe。

我之前希望使用<SdkToolsPath> 进行设置,但那没有用。在 Microsoft.Common.targets 中,SdkToolsPath 是从 TargetFrameworkSDKToolsDirectory 设置的,所以我尝试了它并且它有效。这是在 Visual Studio 2015 上,从 ant 调用 msbuild。

通过MSBuild Using Incorrect Version of sgen.exe to Generate XmlSerializer dlls?找到解决方案

【讨论】:

  • 这应该添加到 CSProj 的什么地方?在哪个标题下?
【解决方案3】:

在导入之前,您的项目中是否定义了 PlatformToolset 属性?我认为它使用它,也许使用 Project XML 元素上的 ToolsVersion 属性在多个已安装的 SDK 之间进行选择。我认为,从类似的路径有趣的业务来看,IDE 设置 paths 以根据它在项目中特定位置查找的 PlatformToolset 查找内容(从 MSBuild 命令行构建时它可以工作不管它是如何设置的)。

这是来自 vcxproj 文件的示例:

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" 
    ToolsVersion="4.0" 
    xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <!-- NB: see ToolsVersion in above -->

⋮

<PropertyGroup Label="Globals">
  <ProjectGuid>{⋯⋯⋯}</ProjectGuid>
  <RootNamespace>blahblahblah</RootNamespace>
  <ConfigurationType>StaticLibrary</ConfigurationType>
  <PlatformToolset>Windows7.1SDK</PlatformToolset>
  <!-- NB: PlatformToolset must be repeated in each top-level project file -->
  <Keyword>Win32Proj</Keyword>
</PropertyGroup>

我认为如果将它放在一个公共属性页中会产生有趣的结果,我认为有两个原因:首先,它需要在导入标准内置逻辑之前设置(例如Microsoft.Cpp.Default.props),其次是 IDE 不知何故设置路径本身或对生成的解决方案文件执行某些操作,并在主文件中查找该属性。当我通过按 F7 构建时遇到错误的路径(使用了错误版本的 EXE),当它从命令行调用 MSBuild 工作正常时,我了解到这一点。

在 IDE 中,在项目的属性编辑器中检查 Platform Toolset。确保它以粗体显示;也就是说,直接设置在那里而不是继承,即使它显示了正确的版本。

【讨论】:

  • @Tony_Henrich 我将其添加到答案中。
  • 我认为这适用于 C++ 项目。这些设置在 C# 中不存在。汉斯的建议奏效了。
猜你喜欢
  • 2014-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-06
  • 2014-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多