当“始终复制到输出目录”设置时,内容(Content)和无(None)有什么区别?

38
在 csproj 文件中,我们可以使用 NoneContent 元素来包含一个文件。根据 MSDN 中的说明:

None - 文件不会被包含在项目输出组中,也不会在构建过程中编译。例如,它可以是一个包含文档(如 Readme 文件)的文本文件。

Content - 文件不会被编译,但会被包含在 Content 输出组中。例如,这是 .htm 或其他类型的 Web 文件的默认设置。

但由于无论是 None 还是 Content 元素都可以包含 CopyToOutputDirectory 元素,因此我想知道如果将其设置为 Always,那么 NoneContent 的行为是否相同呢?

在构建msi/setup项目时,您可以在构建中包含不同的文件类型,并为它们指定不同的位置。例如,您可以指定将“内容”文件放置在特定文件夹中。请注意,这并没有回答您的问题,而是指出文件类型也可以被其他工具使用。 - pinkfloydx33
1个回答

26

并非所有通过设置CopyToOutputDirectory复制到输出目录的内容都会被复制到Content Output Group。 因此,您可以这样做:

File1---CopyToOutputDirectory = Copy always, Content 
File2---CopyToOutputDirectory = Copy always, Content 
File3---CopyToOutputDirectory = Copy always, None

所有三个文件都将被复制到输出目录,但只有 File1File2 会被复制到内容输出组中。

此外,Content 允许您通过 Application.GetContentStream(URI) 以流的形式检索文件(与程序集在同一目录中)。为使该方法能够正常工作,需要添加一个 AssemblyAssociatedContentFile 自定义属性,Visual Studio 在您将文件标记为 Content 时会自动添加。

NoneContent 是“文件与构建和部署过程之间关系”的值。因此,构建(例如 MS Build)和部署可能与仅从输出目录获取文件非常不同。您可能有一个在输出目录中并不真正需要,但是在部署中需要的 .bat 文件。

这篇 SO 回答提供了有关不同构建操作的更多详细信息。


2
为什么要将File1File2添加到您的答案中?似乎只需要其中一个就可以了。我有什么遗漏吗? - manymanymore
1
我发现的一个明显的区别是它们被发布时的情况:"None" 项目不会包含在发布文件夹中,而 "Content" 项目会。这只发生在某些项目类型中,例如 .net framework WebAPI 应用程序、.net framework 控制台应用程序。但是,.net core WebAPI 应用程序则不是这种情况。 - Kevin Xiong
@KevinXiong,这是一个有意义的好解释。已发布的项目进入“应用程序”,但无项目仅在测试中显示。也许这就是“内容输出组”的作用。 - dashesy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接