Visual Studio 项目属性中的各种“构建操作”设置是啥?它们的作用是啥?

Posted

技术标签:

【中文标题】Visual Studio 项目属性中的各种“构建操作”设置是啥?它们的作用是啥?【英文标题】:What are the various "Build action" settings in Visual Studio project properties and what do they do?Visual Studio 项目属性中的各种“构建操作”设置是什么?它们的作用是什么? 【发布时间】:2010-09-13 19:55:43 【问题描述】:

在大多数情况下,您只需将 Visual Studio 为您设置的任何内容作为默认设置...我指的是在解决方案资源管理器中选择的每个文件的 BuildAction 属性。有很多选择,很难知道每个选项会做什么。

【问题讨论】:

【参考方案1】:

构建操作控制项目中每个项目的 MSBuild 项目类型。例如,CompileMyClass.cs 上的构建操作在您的.csproj 文件中意味着这样的内容:

<ItemGroup>
  <Compile>MyClass.cs</Compile>
</ItemGroup>

项目类型按照约定具有特定的含义。常见的类型有CompileContentNone,但还有其他类型。

例如,.editorconfig 文件有自己的项目类型 (EditorConfigFiles)。通过使用“C# 分析器附加文件”(AdditionalFiles) 标记文件,可以将文件传递给分析器。

您也可以通过AvailableItemName 在您的项目中使用define your own item types 来实现您自己的目的。例如:

<ItemGroup>
  <AvailableItemName Include="Foo" />
</ItemGroup>

这样做会产生:

【讨论】:

【参考方案2】:

:该文件未包含在项目输出组中,并且未在构建过程中编译。一个示例是包含文档的文本文件,例如自述文件。

编译:文件被编译到构建输出中。此设置用于代码文件。

Content:允许您通过 Application.GetContentStream(URI) 以流的形式检索文件(与程序集位于同一目录中)。要使此方法起作用,它需要一个 AssemblyAssociatedContentFile 自定义属性,当您将文件标记为“内容”时,Visual Studio 会优雅地添加该属性

嵌入资源:将文件嵌入到专有程序集清单资源中。

资源 (仅限 WPF):将文件嵌入到名为 AppName.g 的共享(由具有类似设置的程序集中的所有文件)程序集清单资源中.资源。

页面 (仅限WPF):用于将xaml 文件编译成baml。然后将baml 嵌入与Resource 相同的技术(即作为`AppName.g.resources 提供)

ApplicationDefinition (仅限 WPF):标记定义应用程序的 XAML/类文件。您使用 x:Class="Namespace.ClassName" 指定代码隐藏,并使用 StartupUri="Window1.xaml"

设置启动表单/页面

SplashScreen (仅限 WPF):标记为 SplashScreenis shown automatically when an WPF application loads, and then fades

的图像

DesignData:编译 XAML 视图模型,以便可以在 Visual Studio 中使用示例数据预览用户控件(使用模拟类型)

DesignDataWithDesignTimeCreatableTypes:编译 XAML 视图模型,以便可以在 Visual Studio 中使用示例数据预览用户控件(uses actual types)

EntityDeploy(实体框架):used to deploy the Entity Framework artifacts

CodeAnalysisDictionary:包含custom word dictionary for spelling rules 的 XML 文件

【讨论】:

"DesignData" 用于“Blendability”,允许您添加基于 WPF 标记的数据,即,当应用正确的设置时,然后显示在 Design时间。 另请注意,使用一键部署时会包含内容,但即使选择了“如果较新则复制”也不会包含内容。 Fake、CodeAnalysisDictionary 和 XamlAppRef 怎么样? AdditionalFiles 怎么样?我在 VS 2015 中看到它,但找不到它的参考。 指出您可以自定义自己的构建操作也很有用:blogs.msdn.microsoft.com/msbuild/2005/10/06/…【参考方案3】: Fakes: Microsoft Fakes(单元测试隔离)框架的一部分。并非在所有 Visual Studio 版本上都可用。 Fakes 用于支持项目中的单元测试,通过用存根或填充程序替换应用程序的其他部分来帮助您隔离正在测试的代码。更多信息:https://msdn.microsoft.com/en-us/library/hh549175.aspx

【讨论】:

【参考方案4】:

Microsoft Connect 中的this page 怎么样(解释 DesignData 和 DesignDataWithDesignTimeCreatableTypes)类型。引用:

下面描述了示例数据文件的两个构建操作。

必须为示例数据 .xaml 文件分配以下构建操作之一:

DesignData示例数据类型将被创建为虚假类型。当示例数据类型不可创建或具有要为其定义示例数据值的只读属性时,请使用此构建操作。

DesignDataWithDesignTimeCreatableTypes将使用示例数据文件中定义的类型创建示例数据类型。当示例数据类型可使用其默认的空构造函数创建时,请使用此构建操作。

不是那么令人难以置信的详尽,但它至少给出了一个提示。 This MSDN walkthrough 也给出了一些想法。我不知道这些构建操作是否也适用于非 Silverlight 项目。

【讨论】:

答案中的第一个链接已过时 - “Microsoft Connect 已停用”【参考方案5】:

VS2010 有一个“构建操作”的属性,也有一个“复制到输出目录”的属性。因此,如果复制属性设置为“如果较新则复制”或“始终复制”,则“无”操作仍将复制到构建目录。

因此应保留“内容”的构建操作以指示您将通过“应用程序.GetContentStream”访问的内容

对于一些外部链接的 .config 包含,我使用了“无”的“构建操作”设置和“复制到更新目录”的“复制到输出目录”设置。

G.

【讨论】:

谢谢。但是,我对如何/在何处执行此操作有些困惑。理想情况下,我只想“包含”我的“上传”文件夹,所有子文件都将包含在发布中。 这适用于对象资源管理器中单个项目的属性,当您选择项目或右键单击并选择属性时,您将在属性选项卡中看到这些属性。对于您想要的,我认为您只需在右键单击项目时添加现有项目。顺便说一句,添加现有项目对话框的保存按钮有一个下拉菜单,可让您将其添加为链接。您可能仍然需要在文件夹中添加项目。【参考方案6】:

在 VS2008 中,似乎最有用的文档条目是:

Windows Presentation Foundation 构建 WPF 应用程序 (WPF)

ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.en/wpf_conceptual/html/a58696fd-bdad-4b55-9759-136dfdf8b91c.htm

应用程序定义 标识包含应用程序定义的 XAML 标记文件(根元素为 Application 的 XAML 标记文件)。当 Install 为 true 且 OutputType 为 winexe 时,ApplicationDefinition 是必需的。一个 WPF 应用程序,因此,一个 MSBuild 项目只能有一个 ApplicationDefinition。

页面 标识其内容被转换为二进制格式并编译为程序集的 XAML 标记文件。页面项通常与代码隐藏类一起实现。

最常见的页面项目是 XAML 文件,其***元素是以下之一:

Window (System.Windows..::.Window).

Page (System.Windows.Controls..::.Page).

PageFunction (System.Windows.Navigation..::.PageFunction<(Of <(T>)>)).

ResourceDictionary (System.Windows..::.ResourceDictionary).

FlowDocument (System.Windows.Documents..::.FlowDocument).

UserControl (System.Windows.Controls..::.UserControl).

资源 标识编译到应用程序程序集中的资源文件。如前所述,UICulture 处理资源项。

内容 标识与应用程序一起分发的内容文件。描述内容文件的元数据被编译到应用程序中(使用 AssemblyAssociatedContentFileAttribute)。

【讨论】:

【参考方案7】:

Page -- 获取指定的 XAML 文件,并编译成 BAML,并将该输出嵌入到程序集的托管资源流中(特别是 AssemblyName.g.resources),此外,如果您在根 XAML 上具有适当的属性文件中的元素,它将创建一个 blah.g.cs 文件,其中将包含该页面的“代码隐藏”的部分类;这基本上涉及调用 BAML goop 以将文件重新水合到内存中,并将类的任何成员变量设置为现在创建的项目(例如,如果您将 x:Name="foo" 放在项目上,您将能够执行 this.foo.Background = Purple; 或类似操作。

ApplicationDefinition -- 类似于 Page,除了它更进一步,并定义了应用程序的入口点,该入口点将实例化您的应用程序对象,在其上调用 run,然后实例化 StartupUri 属性设置的类型,并将给你的主窗口。

另外,需要明确的是,这个问题总体上在其结果集中是无限的;任何人都可以通过构建一个 MSBuild 任务来定义额外的 BuildAction。如果您查看 %systemroot%\Microsoft.net\framework\vversion\ 目录,并查看 Microsoft.Common.targets 文件,您应该能够破译更多内容(例如,使用 VS Pro 及更高版本,有一个“影子”操作允许您生成私有访问器来帮助对私有类进行单元测试。

【讨论】:

我希望您不介意我将您的部分答案复制到 Gishu 的答案中,以便获得更完整的参考答案。【参考方案8】:

来自文档:

BuildAction 属性表示 Visual Studio 对文件的作用 执行构建时。构建动作 可以有以下几个值之一:

无 - 文件不包含在 项目输出组而不是 在构建过程中编译。一个 示例是一个文本文件,其中包含 文档,例如自述文件。

编译 - 文件被编译成 构建输出。使用此设置 用于代码文件。

内容 - 文件未编译, 但包含在内容输出中 团体。例如,这个设置是 .htm 或其他文件的默认值 一种网络文件。

嵌入式资源 - 此文件是 嵌入到主项目构建中 输出为 DLL 或可执行文件。它是 通常用于资源文件。

【讨论】:

有趣!我安装了 VS2008,不知道为什么它们没有出现在我的文档中? PRI 资源呢? @PaulBatum 你能插入这个引用定义的参考吗? @Raymond 232:引用了什么定义? @PaulBatum:是的,确实参考会很好。答案以“来自文档”开头,因此不胜感激。

以上是关于Visual Studio 项目属性中的各种“构建操作”设置是啥?它们的作用是啥?的主要内容,如果未能解决你的问题,请参考以下文章

使用Visual Studio 2019中的v141平台工具集进行C ++ / CX项目的构建失败

Visual Studio 2013 中的“每个文件”自定义构建步骤在哪里?

XCode 是不是有类似于 Visual Studio 中的属性文件的内容

从 Visual Studio 项目中的项目中删除所有未使用的引用

Visual Studio中的c ++并行构建行为[重复]

重命名 Visual Studio 2008 MFC 项目后出现 R6034 运行时错误