我过去为我的C++项目进行了很多MSBuild定制。MSBuild目标的Input和Output属性用于确定是否需要执行该目标。此外,Visual Studio使用位于中间目录中的.tlog文件来确定是否需要调用MSBuild。
现在我正在处理一个C#项目。我编写了一个简单的MSBuild目标,将文件复制到输出目录:
如果通过MSBuild.exe调用构建,则目标按预期工作。如果目标文件不存在或源文件已被修改,则会复制该文件。
如果我在Visual Studio中调用构建,则不会按预期工作。如果我从输出目录中删除文件,则Visual Studio不会调用MSBuild。另一方面,每次我修改源文件并构建项目时,都会调用MSBuild,即使没有进行其他更改。
似乎Visual Studio只比较项目中的每个文件与输出文件(.exe、.dll或.pdb)。如果项目中的任何文件比输出文件更新,则会调用MSBuild。在我的情况下,MSBuild不会更新.exe文件,因此会一遍又一遍地调用MSBuild。
在C++项目中,这种行为由.tlog文件控制。在C#项目中有类似的东西吗?
非常感谢!
现在我正在处理一个C#项目。我编写了一个简单的MSBuild目标,将文件复制到输出目录:
<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="CopyMyFile" BeforeTargets="AfterBuild" Inputs="$(ProjectDir)File.dat" Outputs="$(TargetDir)FileRenamed.dat">
<Copy SourceFiles="$(ProjectDir)File.dat" DestinationFiles="$(TargetDir)FileRenamed.dat" OverwriteReadOnlyFiles="true">
</Copy>
</Target>
</Project>
如果通过MSBuild.exe调用构建,则目标按预期工作。如果目标文件不存在或源文件已被修改,则会复制该文件。
如果我在Visual Studio中调用构建,则不会按预期工作。如果我从输出目录中删除文件,则Visual Studio不会调用MSBuild。另一方面,每次我修改源文件并构建项目时,都会调用MSBuild,即使没有进行其他更改。
似乎Visual Studio只比较项目中的每个文件与输出文件(.exe、.dll或.pdb)。如果项目中的任何文件比输出文件更新,则会调用MSBuild。在我的情况下,MSBuild不会更新.exe文件,因此会一遍又一遍地调用MSBuild。
在C++项目中,这种行为由.tlog文件控制。在C#项目中有类似的东西吗?
非常感谢!