我在Visual Studio 2010中有一个WiX项目,该项目使用内联MSBuild任务在" BeforeBuild"中设置环境变量。目标。以前构建的自定义任务没有问题;但是,我现在遇到构建错误,即使自上次成功构建以来项目/解决方案根本没有改变。事实上,相同的代码在另一台开发人员机器上正确构建......
如果我从命令行构建项目,它也可以正确构建。这让我相信VS 2010环境可能会以某种方式被破坏?
自上次构建项目以来,我安装了许多程序(VS 2015,.NET Core等)。维修VS 2010会是一个选择吗?我安装了VS 2010 SP1。
自定义任务在项目文件中内联定义:
<!-- Define task to set environment variables for the current process -->
<UsingTask TaskName="SetEnvironmentVariableTask" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v$(MSBuildToolsVersion).dll">
<ParameterGroup>
<Name ParameterType="System.String" Required="true" />
<Value ParameterType="System.String" Required="true" />
</ParameterGroup>
<Task>
<Using Namespace="System" />
<Code Type="Fragment" Language="cs"><![CDATA[
Environment.SetEnvironmentVariable(Name, Value, EnvironmentVariableTarget.Process);
]]></Code>
</Task>
</UsingTask>
在之前的构建目标中调用:
<Target Name="BeforeBuild">
<SetEnvironmentVariableTask Name="WIX_TEMP" Value="$(MSBuildProjectDirectory)\$(IntermediateOutputPath)" />
</Target>
构建错误是:
Initializing task factory "CodeTaskFactory" from assembly "C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Build.Tasks.v4.0.dll".
error MSB3758: An error has occurred during compilation
error CS0012: The type 'Microsoft.Build.Framework.ITask' is defined in an assembly that is not referenced. You must add a reference to assembly 'Microsoft.Build.Framework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'.
更新2017-01-19
我尝试过使用Emilio的建议;但是,似乎没有正确设置MSBuild变量(我在构建过程中使用<Message>
元素输出它们):
MSBuildExtensionsPath = 'C:\Program Files (x86)\MSBuild'
MSBuildAssemblyVersion = ''
MSBuildToolsPath = 'C:\Windows\Microsoft.NET\Framework\v4.0.30319'
另外,如果我查看C:\Program Files (x86)\MSBuild
文件夹,我只会看到VS 2013(12.0)和VS 2015(14.0)的子文件夹,而不是VS 2010(10.0)...虽然我&#39 ;我不确定VS 2010会安装MSBuild的东西吗?
答案 0 :(得分:0)
似乎安装VS2015会修改您正在使用的某些MSBuild变量(例如 $(MSBuildToolsPath))。
使用
时遇到同样的问题<UsingTask TaskName="MyCustomTask" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
无论项目文件中指定的ToolsVersion
如何。
我最终使用
<UsingTask TaskName="MyCustomTask" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildExtensionsPath)\$(MSBuildAssemblyVersion)\Bin\Microsoft.Build.Tasks.Core.dll">