What is Content Build Action in Visual Studio?

2019-01-22 17:47发布

问题:

What does the Content Build Action in Visual Studio do? It does not look like it's doing anything.

The File Properties article on MSDN (does not exist anymore) says:

Content - The file is not compiled, but is included in the Content output group. For example, this setting is the default value for an .htm or other kind of Web file.

But I have no idea what the "Content output group" means.

Is this something about deployment? Meaning, the action has no actual effect, when building, but only later when deploying?

回答1:

"Content" means that it is a deployable project item, it signals that the file needs to be copied to the target machine.

Something you can see with a simple console mode project. Project + Add New Item, pick the Bitmap File item template. Its Build Action is automatically set to "Content". Use Project + Properties, Publish tab and click the Application Files button. Note how the bitmap automatically got added to the list of deployed files:

Go back to the Properties window and change its Build Action to None. Click the button again and note how the file is now no longer included.

Also used by installer utilities that integrate with VS for the exact same reason. And a big deal in web applications, they usually have a lot of files that need to be deployed to the web server.



回答2:

Updated Visual Studio documentation has more meaningful description:

Content - A file marked as Content can be retrieved as a stream by calling Application.GetContentStream. For ASP.NET projects, these files are included as part of the site when it's deployed.


Also after some testing and with a hint from What are the various "Build action" settings in Visual Studio project properties and what do they do?, I've found that the Content build action has this effect in WPF projects (possibly ASP too).

It adds

[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("filename")]

to WpfApplication1_Content.g.cs. Read about the AssemblyAssociatedContentFileAttribute.

In console or WinForms applications, it does not do anything (neither in source code nor output binary).

Though in the comment, to previously mentioned question, there's a note about effect on deployment:

Also note that Content will be included when using one-click deploy, but None won't even if "copy if newer" is selected.

Possibly this works even for console and WinForms applications (I haven't tried).



回答3:

I think this is only relevant for C# projects. See the image:

If you set the 'Copy Output Directory' to 'Copy always' or 'Copy if newer' it will copy that file to the output folder when build. What action is performed when you press 'Build (solution)' depends on the 'Build action' property. From what I understand of the Microsoft website it just copies the file if it is a content file like a text, html or other normal file.

What other Build actions do is not known to me, it seems like an advanced option.

The bottom line: it seems a feature that helps you keep the folder structure and files organised each build, so it is always ready for deployment. I hope this gives you an idea of the feature.