3

我对 Visual Studio 2008 中的“复制到输出”功能有疑问。也许我误解了它应该如何工作。

我有四个项目的解决方案:

  • TestApp1(Windows 应用程序)
  • TestAppA(Windows 应用程序)
  • TestProj1(类库)
  • TestProjA(类库)

依赖项如下(依赖项如项目参考)。

  • TestProj1 不依赖任何东西。
  • TestApp1 依赖于 TestProj1
  • TestProjA 依赖于 TestProj1
  • TestAppA 依赖于 TestProjA(因此间接依赖于 TestProj1)

换句话说,依赖树看起来像这样。

TestApp1
    TestProj1
TestProjA
    TestProj1
TestAppA
    TestProjA
        TestProj1

(每个项目也引用了标准程序集(system、system.core 等))

在 TestProj1 中,我添加了一个文本文件 Test.txt。在此文件的属性中,我指定了“构建操作:内容”和“复制到输出目录:始终复制”。

当我构建解决方案时,Test.txt 被复制到

  • TestApp1\bin\Debug
  • TestProj1\bin\Debug
  • TestProjA\bin\Debug

该文件没有复制到 TestAppA\bin\debug ,这就是我觉得奇怪的地方。由于TestProj1 依赖Test.txt 工作,而TestAppA 依赖TestProj1,通过TestProjA,TestApp1 将无法工作。

如果我将来自 TestAppA 的项目引用直接添加到 TestProj1(因此我有一个对 TestProj1 的引用和另一个对 TestProjA 的引用),该文件将被复制到 TestAppA\bin\debug 文件夹。

当然,我可以设置一个自定义构建事件来将文件 Test.txt 复制到 TestAppA\bin\debug,但是我对自定义构建事件有不好的体验,并且更愿意依赖内置的复制机制。

所以我的问题是:为什么不将 Test.txt 复制到 TestAppA\Bin\debug?

4

2 回答 2

4

托德已经回答得很好,但是两个更常见的解决方案是:

  • 将构建后步骤添加到您的依赖项目,将 Test.txt 复制到其输出文件夹中
  • 将文本文件作为嵌入资源添加到您的 TestProj1 项目的程序集中,并完全摆脱对外部数据文件的需要

I'd also suggest that all your dependencies could simply call an API in TestProj1 to retrieve the information they require, allowing that assembly to encapsulate the data and store it wherever, however, and in whatever format it likes.

于 2009-12-12T17:07:51.503 回答
2

Visual Studio 仅查看内容文件的直接引用,因此 TestAppA 不知道 Test.txt 存在,因为它在 TestProjA 项目文件中看不到它。

这是 Visual Studio 的一个限制,也是许多人最终将所有项目的输出指向同一个文件夹的原因。

您拥有的另一个选项是创建一个“SharedContent”文件夹。然后,您可以将文本文件放在该文件夹中,并通过在每个项目上选择“添加 > 现有项目...”将其添加到依赖它的每个项目中。在“添加项目”对话框中,从共享文件夹中选择文本文件,然后单击“添加”按钮上的小向下箭头。如果您选择“添加为链接”,您可以将文件添加到您的项目中而无需创建副本。

于 2009-12-12T16:56:01.863 回答