在应用程序构build期间自动复制文件以输出

C#项目中的文件有“ 复制到输出目录”属性。 但在VC + +项目中是缺席的。 我知道,我可以在VC ++中使用构build事件 ,并写在那里

xcopy /y /d %(FullPath) $(OutDir) 

有没有办法避免使用CMD(和其他脚本方法)? 在这种情况下,msbuild能做些什么来帮助吗?

这取决于你使用的是什么版本的Visual Studio。 Visual Studio 2008中VC ++项目文件的格式不是MSBuild,所以在PostBuildStep中使用xcopy是个不错的select。

Visual Studio 2010中的VC ++项目具有MSBuild格式。 因此,有MSBuild复制任务的function。

以下是一个示例:

 <Copy SourceFiles="%(FullPath)" DestinationFolder="$(OutDir)" /> 

如果目标目录不存在,则自动创build

MSDN复制任务参考在这里

在这种情况下,MSBuild能做些什么来帮助吗?

使用MSVC 2012,这对我工作:

假设你在c ++项目中有一个“Data / ThisIsData.txt”文件。

卸载项目(右键单击 – >卸载项目)。
编辑项目XML(右键 – >编辑.vcxproj)
现在,您可以在编辑器中将项目MSBuild文件看作XML。

find“ThisIsData.txt”。 它应该看起来像这样:

 <ItemGroup> <None Include="Data\ThisIsData.txt" /> ... </ItemGroup> 

现在添加一个像这样的其他项目组:

 <ItemGroup> <Content Include="Data\ThisIsData.txt"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> ... </ItemGroup> 

重新加载项目并构build。
您的文件“ThisIsData.txt”应该被复制到$(OutDir)\ Data \ ThisIsData.txt。

为什么复制ItemGroup?

那么如果你只是把None include改成include内容,IDE似乎不再喜欢它,并且不会显示它。 所以为了保留我的数据文件的快速编辑选项,我决定保留重复的条目。

在VS 2015中,可以为C项目提供C#中的function。 (从jochen的答案构build的想法。)而不是添加另一个ItemGroup,修改给定的项目组添加一个CopyTo元素。 IE,用他的例子,简单地将原来的条目增加到:

 <ItemGroup> <None Include="Data\ThisIsData.txt" /> <DeploymentContent>true</DeploymentContent> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> ... </ItemGroup> 

没有其他的ItemGroup需要。 通过添加CopyTo元素,您添加一个“包含项目”属性。

包含项目的VS 2015 C属性已添加

遵循henri-socha关于VS2015的回答 (可能是VS2013和VS2012,或者任何使用MSBuild风格的项目),ItemGroup的项目types非常重要。

具体来说, <Text>项目似乎不被复制,而<Content>项目。

因此,对于包含文本文件ThisIsData.txt的项目目录Data ,将在$(OutDir)目录下创build一个子目录Data ,并将来自项目的文件ThisIsData.txt复制到新目录中:

 <ItemGroup> <Content Include="Data\ThisIsData.txt"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> </ItemGroup> 

这不会,但是,如果将文本文件添加到项目中,Visual Studio IDE将插入该Content ,并将Content属性设置为True

 <ItemGroup> <Text Include="Data\ThisIsData.txt"> <DeploymentContent>true</DeploymentContent> </Text> </ItemGroup> 

换句话说,您需要通过IDE添加文件以使其意识到文件包含在项目中(其中添加了<Text>标签ItemGroup),然后在文本编辑器中打开该项目并添加<Content>标签ItemGroup让它做你想做的事情。

我不确定<DeploymentContent>标签实际上做了什么。 这可能是一个剩余的,因为唯一的MSDN参考我可以find它认为它存档: https : //msdn.microsoft.com/en-us/library/aa712517.aspx

您还可以将Configuration Properties – > General – > Output directory下的目标目录更改为您要使用的目录。

如果它是一个COM DLL,你可以将它添加到你的项目的根目录,标记为“内容”,并设置复制到输出目录为“始终”。 我不得不这样做签名捕获COM程序集。