C# 仅在进行编译时运行自定义目标

C# 仅在进行编译时运行自定义目标,c#,msbuild,C#,Msbuild,我已经开发了一个自定义目标,它只需要在编译(csc)时运行(否则构建过程会花费很长时间)。 我发现输入和输出属性可用于比较文件时间戳,并在输入集合中有新文件时执行目标。问题是我的目标没有生成任何文件,因此我不确定应该传递什么作为输出属性以获得此工作正确性(我不能使用目标程序集来检查,因为在执行编译时,程序集的时间戳是实际时间,因此我的目标不会执行) 有什么想法可以实现吗?一个可能的解决方案是使用PostBuildEvent。 为了使其正常工作,我们需要执行以下操作: 将值设置为。这可以直接在中完

我已经开发了一个自定义目标,它只需要在编译(csc)时运行(否则构建过程会花费很长时间)。 我发现
输入
输出
属性可用于比较文件时间戳,并在
输入
集合中有新文件时执行目标。问题是我的目标没有生成任何文件,因此我不确定应该传递什么作为
输出
属性以获得此工作正确性(我不能使用目标程序集来检查,因为在执行编译时,程序集的时间戳是实际时间,因此我的目标不会执行)


有什么想法可以实现吗?

一个可能的解决方案是使用
PostBuildEvent
。 为了使其正常工作,我们需要执行以下操作:

  • 将值设置为
    。这可以直接在
    中完成,例如:
    echo Post build event completed
    。我只使用了
    echo
    将消息写入输出,因为
    不能为空
  • 将属性
    设置为
    OnOutputUpdated
    。这将导致MSBuild比较编译前后的程序集时间戳,并仅在程序集已更改时执行
  • 设置要在
  • 完整的示例如下所示:

    <PropertyGroup>
        <PostBuildEvent>echo Post build event completed</PostBuildEvent>
        <RunPostBuildEvent>OnOutputUpdated</RunPostBuildEvent>
        <PostBuildEventDependsOn>$(PostBuildEventDependsOn);MyCustomTarget</PostBuildEventDependsOn>
    </PropertyGroup>
    
    
    echo生成后事件已完成
    OnOutputUpdated
    $(PostBuildEventDependsOn);MyCustomTarget
    
    您可以写出一个虚拟文件并将其用于输出。在目标中使用WriteListFile任务输出一个名为“MyTarget.output”的文件


    MsBuild将使用该文件的时间戳来跟踪目标上次运行的时间,然后可以判断输入文件是否比输出文件新,并知道如何再次运行目标。

    是的,这绝对是实现此目标的一种可能方法。我试图避免创建虚拟输出文件,并找到更好的方法来实现这一点。但是谢谢你的回答;)