Visual studio MSBuild:如何在Visual Studio中的生成后事件期间访问目标设置的属性值

Visual studio MSBuild:如何在Visual Studio中的生成后事件期间访问目标设置的属性值,visual-studio,msbuild,msbuild-task,msbuildcommunitytasks,Visual Studio,Msbuild,Msbuild Task,Msbuildcommunitytasks,我有一个调用批处理文件的后期构建事件,我需要将特定参数传递到批处理文件中。此参数通过另一个任务填充,该任务通过配置为在PostBuildEvent之前运行的目标调用 我可以看到,当使用元素作为部分的一部分进行显示时,它会成功显示 但是PostBuildEvent下的$(TargetFrameworkToolsFolderPath)具有“”值。是否有方法在生成后事件中访问此自定义属性 例如: <UsingTask TaskName="GetTargetFrameworkToolsFolder

我有一个调用批处理文件的后期构建事件,我需要将特定参数传递到批处理文件中。此参数通过另一个任务填充,该任务通过配置为在PostBuildEvent之前运行的目标调用

我可以看到,当使用元素作为部分的一部分进行显示时,它会成功显示

但是PostBuildEvent下的$(TargetFrameworkToolsFolderPath)具有“”值。是否有方法在生成后事件中访问此自定义属性

例如:

<UsingTask TaskName="GetTargetFrameworkToolsFolderName" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.Core.dll">
   <ParameterGroup>
     <SDKFolderPath ParameterType="System.String" Required="true" />
     <TargetFrameworkVersionStr ParameterType="System.String" Required="true" />
     <TargetFrameworkToolsFolder ParameterType="System.String" Output="true" />
   </ParameterGroup>
   <Task>
     <Code Type="Fragment" Language="cs">
        TargetFrameworkToolsFolder = SDKFolderPath + "\\" + "bin\\NETFX " + TargetFrameworkVersionStr.Substring(1) + " Tools\\";
     </Code>
   </Task>
</UsingTask>

<Target Name="FindTargetFrameworkToolsFolderPath" BeforeTargets="PostBuildEvent">
   <GetFrameworkSdkPath>
     <Output TaskParameter="Path" PropertyName="SdkPath" />
   </GetFrameworkSdkPath>
   <GetTargetFrameworkToolsFolderName SDKFolderPath="$(SdkPath)" TargetFrameworkVersionStr="$(TargetFrameworkVersion)">
     <Output PropertyName="TargetFrameworkToolsFolderPath" TaskParameter="TargetFrameworkToolsFolder"/>
   </GetTargetFrameworkToolsFolderName>
   <Message Text="$(TargetFrameworkToolsFolderPath)" Importance="normal" /> --> Displayed correctly here
</Target>

<PropertyGroup>
   <PostBuildEvent>
      call $(ProjectDir)AfterBuildCommands.bat $(TargetFrameworkToolsFolderPath) --> The TargetFrameworkToolsFolderPath property value here seems to be empty.
   </PostBuildEvent>
</PropertyGroup>


TargetFrameworkToolsFolder=SDKFolderPath+“\\”+“bin\\NETFX”+TargetFrameworkVersionStr.Substring(1)+“Tools\\”;

-->在此正确显示
调用$(ProjectDir)AfterBuildCommands.bat$(TargetFrameworkToolsFolderPath)-->此处的TargetFrameworkToolsFolderPath属性值似乎为空。
但是PostBuildEvent下的$(TargetFrameworkToolsFolderPath)具有 ”“价值。有没有办法在帖子中访问此自定义属性 构建事件

事实上,
是一个属性,MSBuild首先读取所有属性,然后执行所有目标

如果将这些放在定义属性
TargetFrameworkToolsFolderPath
的目标之外,则始终会首先执行这些,正如预期的那样,
TargetFrameworkToolsFolderPath
的值将为空

为了避免这种情况,您应该将
PostBuildEvent
TargetFrameworkToolsFolderPath
属性放在同一个目标中,并确保足够早地执行目标,例如,在
PrepareForBuild
目标之后运行

<PropertyGroup>
   <PostBuildEvent>
      call $(ProjectDir)AfterBuildCommands.bat $(TargetFrameworkToolsFolderPath) --> The TargetFrameworkToolsFolderPath property value here seems to be empty.
   </PostBuildEvent>
</PropertyGroup>

调用$(ProjectDir)AfterBuildCommands.bat$(TargetFrameworkToolsFolderPath)-->此处的TargetFrameworkToolsFolderPath属性值似乎为空。
解决方案

请尝试以下操作:

 <UsingTask TaskName="GetTargetFrameworkToolsFolderName" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.Core.dll">
    <ParameterGroup>
      <SDKFolderPath ParameterType="System.String" Required="true" />
      <TargetFrameworkVersionStr ParameterType="System.String" Required="true" />
      <TargetFrameworkToolsFolder ParameterType="System.String" Output="true" />
    </ParameterGroup>
    <Task>
      <Code Type="Fragment" Language="cs">
        TargetFrameworkToolsFolder = SDKFolderPath + "\\" + "bin\\NETFX " + TargetFrameworkVersionStr.Substring(1) + " Tools\\";
      </Code>
    </Task>
  </UsingTask>
  <Target Name="MyFindTargetFrameworkToolsFolderPath" AfterTargets="PrepareForBuild">
    <GetFrameworkSdkPath>
      <Output TaskParameter="Path" PropertyName="SdkPath" />
    </GetFrameworkSdkPath>
    <GetTargetFrameworkToolsFolderName SDKFolderPath="$(SdkPath)" TargetFrameworkVersionStr="$(TargetFrameworkVersion)">
      <Output PropertyName="TargetFrameworkToolsFolderPath" TaskParameter="TargetFrameworkToolsFolder" />   
    </GetTargetFrameworkToolsFolderName>

    <PropertyGroup>
      <PostBuildEvent> call $(ProjectDir)AfterBuildCommands.bat $(TargetFrameworkToolsFolderPath) --> The TargetFrameworkToolsFolderPath property value here seems to be empty.</PostBuildEvent>
    </PropertyGroup>
    <Message Text="$(TargetFrameworkToolsFolderPath)" Importance="normal" />   

  </Target>


TargetFrameworkToolsFolder=SDKFolderPath+“\\”+“bin\\NETFX”+TargetFrameworkVersionStr.Substring(1)+“Tools\\”;

调用$(ProjectDir)AfterBuildCommands.bat$(TargetFrameworkToolsFolderPath)-->此处的TargetFrameworkToolsFolderPath属性值似乎为空。

希望它能对您有所帮助。

请将“…”放入target
FindTargetFrameworkToolsFolderPath
并更改为
postertargets=“PrepareForBuild”
@Perry谢谢您的回复。它工作得很好!!完成此操作后,在VisualStudio中查看“项目属性生成事件”选项卡时,我再也看不到生成后事件。有没有办法解决这个问题?非常感谢您的回复@Perry It worked!!我只有一个问题。完成此操作后,在VisualStudio中查看“项目属性生成事件”选项卡时,我再也看不到生成后事件。有办法解决这个问题吗?谢谢已经标记为答案!有没有办法让它在Visual Studio项目属性的生成后事件命令行中正确显示?我认为这是不可能的。当生成后事件位于全局环境中时,它可以显示在项目属性中。在这种情况下,只能使用系统属性。由于要使用通过生成后事件在本地定义的自定义属性,因此它位于本地环境中,无法显示在项目属性中。但是,这并不影响最终结果。您可以直接在“xxxx.csproj”文件中修改生成后事件。