Visual studio 为什么Visual Studio 2013对lc.exe使用了错误的SdkToolsPath?

Visual studio 为什么Visual Studio 2013对lc.exe使用了错误的SdkToolsPath?,visual-studio,visual-studio-2013,msbuild,Visual Studio,Visual Studio 2013,Msbuild,我正在将Visual Studio 2013与asp.net项目一起使用。其中一个项目给出了以下错误。 为什么它在错误的路径中查找LC.exe?我的Windows 8.1 SDK已安装,并且在 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

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

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=“$(targetFrameworkDKToolsDirectory)”
。然后查看下面的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 
看起来不错。该项目在VS.NET4.0中的目标

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

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

导入之前,项目中是否定义了
PlatformToolset
属性?我认为它使用了这个属性,还可能使用projectxml元素上的
ToolsVersion
属性在多个已安装的SDK之间进行选择。我认为,从类似的路径有趣的业务来看,IDE设置路径以基于
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>

⋮
{⋯⋯⋯}
布拉布拉布拉赫
静态库
Windows7.1SDK
Win32Proj
我认为有两个原因可以解释为什么将其放在公共属性页中会产生有趣的结果:首先,需要在导入标准内置逻辑之前设置它(例如
Microsoft.Cpp.Default.props
)第二,IDE以某种方式自行设置路径或对生成的解决方案文件执行某些操作,并在主文件中查找该属性。我了解到这一点是在通过按F7生成错误路径(使用了错误版本的EXE)时,它在从命令行调用MSBuild时工作正常

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


事实证明,您可以直接在.csproj文件中指定SDK的路径:

C:\ProgramFiles(x86)\Microsoft SDK\Windows\v10.0A\bin\NETFX 4.6工具

而构建就是这样找到lc.exe的

我以前希望使用
设置此项,但这不起作用。在Microsoft.Common.targets中,SdkToolsPath是从TargetFrameworkDKToolsDirectory中设置的,所以我尝试了,结果成功了。这是在Visual Studio 2015上进行的,并且从ant调用了msbuild


通过

找到的解决方案我使用了一种与上面Hans Passant建议的稍有不同的方法。 我的场景是,我的构建是通过Jenkins(一种CI工具)在Windows 2008服务器上使用MSBuild 2015执行的

根据文档,Microsoft SDK 10不支持Windows 2008。我尝试了同时使用
SdkToolsPath
FrameworkOverride
msbuild命令行参数,但没有成功(没有一起尝试,只是在键入时才实现)

在任何情况下,成功的是,我无法强制msbuild使用更新的SDK版本,而不是来自Windows 7的版本 (它坚持从
C:\Program Files\Microsoft SDK\Windows\v7.1\Bin\NETFX 4.0 Tools
)中获取LC.exe)-因此我的黑客攻击是用SDK 10中的LC.exe覆盖LC.exe(我已安装在运行Windows 2008的本地计算机中,而不是构建服务器中)


我的构建终于成功了。

它寻找正确的SDK,而不是正确的子目录。它存储在v7.0A\bin中。它最终如何粘合“NETFX 4.0工具”最后很难猜测。这可能只是一个MSBuild错误,许可证编译器并没有得到太多的使用,SDK 8.x带来的剧变留下了很多伤疤。最简单的方法是自己创建子目录并将lc.exe复制到其中。一定要检查lc.exe的需要,在web项目中使用它很奇怪。这很有效。你可以做到一个答案。我仍然觉得奇怪的是,它在错误消息中声称它正在寻找V7.0A。@ TyyyHy富有,我把它添加到答案。我认为这适用于C++项目。这些设置在C.*中不存在。汉斯的建议是有效的。在CSProj中应该添加什么?在哪个标题下?et,这是唯一对我有效的方法。我找不到一种方法来强制我的Windows Server 2008上的msbuild使用v10.0A\bin\NETFX 4.6.2 Tools\lc.exe。它只是不断引用v8.1A NETFX 4.5.1。不过,我想知道一种简单地通过参数化msbuild来解决它的方法。。。