无法使用CodeTaskFactory创建内联构建任务(构建错误MSB3758和CS0012)

时间:2016-12-20 11:11:06

标签: visual-studio visual-studio-2010 msbuild wix msbuild-task

我在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的东西吗?

1 个答案:

答案 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">