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