.net - MSBuild 使用了错误的框架版本
问题描述
我正在制作一个 MSBuild 文件,在其中我需要使用 Microsoft.Build.Tasks.v4.0.dll,问题是 MSBuild 无法找到这个文件......它找不到它,因为 MSBuildToolsPath 指向错误.Net 框架的版本...为什么?我该如何阻止这种情况发生?为什么 ISNT 这个测试使用它编译的 MSBuild 版本?
我有以下简单的目标文件(我保存为 MSBuildTest.targets)来演示我看到的问题
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="Default">
<Message Text="$(MSBuildToolsPath)" />
</Target>
</Project>
C:\Test> C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild MSBuildTest.targets
Microsoft (R) Build Engine 版本 4.7.3062.0 [Microsoft .NET Framework,版本 4.0.30319.42000] 版权所有 (C) Microsoft Corporation。版权所有。
构建开始于 2018 年 12 月 8 日 17:46:07。节点 1 上的项目“MSBuildTest.targets”(默认目标)。默认:
C:\windows\Microsoft.NET\Framework\v2.0.50727
完成构建项目“MSBuildTest.targets”(默认目标)。
构建成功。0 警告 0 错误
经过时间 00:00:00.07
那么,当我使用 MSBuild v4.0.30319执行时,为什么 MSBuildToolsPath 指向v2.0.50727?
我确实做了一点挖掘,在注册表编辑器下,我有这个键
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\ToolsVersions\4.0
...有了这个值...
MSBuildToolsPath = C:\Windows\Microsoft.NET\Framework64\v4.0.30319\
这让我发疯了,有什么帮助吗??
解决方案
MSBuildTest.targets 的全部内容发布在问题中。
如下修改目标文件并设置ToolsVersion="4.0"会产生正确的输出,如下所示
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
<Target Name="Default">
<Message Text="$(MSBuildToolsPath)" />
</Target>
</Project>
Microsoft (R) Build Engine 版本 4.7.3062.0 [Microsoft .NET Framework,版本 4.0.30319.42000] 版权所有 (C) Microsoft Corporation。版权所有。
构建开始于 17/08/2018 12:17:06。节点 1 上的项目“C:\test\MSBuildTest.targets”(默认目标)。默认:
C:\Windows\Microsoft.NET\Framework\v4.0.30319
完成构建项目“C:\test\MSBuildTest.targets”(默认目标)。
我认为问题在于,在使用特定版本的 MSBuild 进行构建时,我希望 MSBuildToolsPath 会根据我使用的 MSBuild 版本进行设置。
推荐阅读
- javascript - 如何从视频创建 Blob URL 并分配给视频源?
- javascript - 如何使用 InnerHTML 将 html 类替换为脚本?
- java - 在 android studio 的 Calculator App 中删除 double 的问题?
- haskell - 如何在得到结果之前永久重试 IO?
- ios - 从回调函数 SWIFT 存储数据
- python - 将 timedelta[64] 列转换为从午夜开始的秒数
- c# - PdfStamper 未添加新文本以辅助 PDF
- docker - 从 sudo minikube start --vm-driver none 切换到 --vm-driver docker 并且无法再访问我的应用程序
- database - Laravel Eloquent:在单个数据库事务中保存模型和关系
- javascript - 滚动到下一个(无论 ID)