51

In Visual Studio (2008) is it possible to force the Post-Build Event for a C++ project to run even if the project is up-to-date?

Specifically, I have a project which builds a COM in-process server DLL. The project has a post-build step which runs "regsvr32.exe $(TargetPath)". This runs fine on a "Rebuild", but runs on a "Build" only if changes have been made to the project's source.

If I do a "Build" without making any changes, Visual Studio simply reports that the project is up-to-date and does nothing - the Post-Build Event is not run. Is there any way that I can force the Event to run in this situation? This is necessary since although the DLL itself is up-to-date, the registration information may not be.

Jean-François Fabre
  • 137,073
  • 23
  • 153
  • 219
user200783
  • 13,722
  • 12
  • 69
  • 135

4 Answers4

67

You can use the Custom Build Step property page to set up a batch file to run. This runs if the File specified in the Outputs setting is not found, or is out-of-date. Simply specify some non-existent file there, and the custom build step will always run. It will run even if your project is up-to-date, since the Output file is never found.

Tarydon
  • 5,097
  • 23
  • 24
  • 2
    I don't see any **Outputs** setting for a **Custom Build Step**. Where do you find the **Outputs** – bpeikes Aug 08 '12 at 14:30
  • I used this general concept to use Exec in an AfterBuild target to delete the output files, like so – David Brunow Feb 05 '14 at 18:51
  • 3
    Oh my, how should one know that without StackOverflow?! Here, on MSDN, is some additional information about the execution order of build steps and build events: https://msdn.microsoft.com/en-us/library/e85wte0k.aspx For my case, I just moved my "Post-Build Event" to the "Custom Build Step" and specified a filename in "Outputs" which does not exist. This reliably executes the custom build step even if the project is up-to-date. – j00hi Dec 07 '17 at 15:59
9

Use this DisableFastUpToDateCheck

See an example:

<PropertyGroup>
    <PostBuildEvent>IF  EXIST C:\Projects\Copy_Files_To_Instance.ps1 ( powershell -file C:\Projects\Copy_Files_To_Instance.ps1)</PostBuildEvent>
    <DisableFastUpToDateCheck>true</DisableFastUpToDateCheck>

diegoapereza
  • 186
  • 1
  • 3
1

In Visual Studio 2017 (perhaps other versions as well), for C# projects (haven't checked for C++ projects per OP's actual question) there is an option for "Run the post-build event:", and one option is "Always", which will run the Post-Build even if nothing has changed, rather than simply reporting that the project is up to date:

enter image description here

BRebey
  • 671
  • 8
  • 12
  • 1
    Tried this, this alone does not work. What worked was [diegoapereza's answer](https://stackoverflow.com/a/49639051/220984) in combination with this setting. – Doc Brown Jan 19 '21 at 14:07
  • I ran into the same issue as Doc Brown. If I update this setting, and I add `true` to a ``, the the task runs every time. – derekbaker783 Mar 12 '23 at 18:56
0

The registration information is determined largely by what's in the .rgs file. If that file changes the project will get built. I am not sure how else COM registration can change without making the project dirty. Do you mind providing more details about your particular situation?

Igor Zevaka
  • 74,528
  • 26
  • 112
  • 128
  • By "the COM registration information may not be up-to-date", I mean the information in the registry may have changed, not that in the .rgs file. I'd like the post-build step to restore the information in the registry to what it should be according to the .rgs. – user200783 Dec 21 '09 at 01:20