【问题标题】:Visual Studio not Copying Directory of Linked FilesVisual Studio 不复制链接文件的目录
【发布时间】:2015-04-26 08:43:35
【问题描述】:

暂存非托管库或资源时的一种常见做法是将这些资源作为链接添加到项目中,并将它们设置为复制到输出目录。

从 Visual Studio 2013 开始,这已得到很好的处理,即使它们被引用的库 Foo 然后由应用程序 Bar 使用,它们最终也会出现在 Bar 的输出目录中。

但文件目录似乎并非如此。

在这种情况下,我的应用程序似乎仅在 rebuild 时将此目录文件复制到输出目录。然后不可避免地我会做几个 build 动作,我会注意到Libs 目录又是空的。然后进行重建cef.pak 又回来了。

我对此的解决方案是使用 构建步骤Libs 目录手动复制到输出目录。尽管我找不到合适的宏来概括地表达即使此构建步骤是Foo 的一部分,我还是希望将文件复制到Bar 的(例如StartUp Project 在VS 术语中)输出目录。

更新

感谢大家的精彩回答和测试。我应该澄清一下,当两者之间有额外的库时,我仍然会看到这个问题。也就是说,应用程序Bar 引用库Foo 引用库Other,这是带有这些链接文件的库。在这种情况下,当Other 的链接文件被设置为复制到输出目录时,它们似乎只能在重建时进行。我对此的解决方案不太理想,即让Foo 直接引用Other

【问题讨论】:

  • 我遇到过这个问题(请阅读我的回答)如果您需要更多解决方案,请添加评论,我会为您提供。请向微软提交错误,也许他们会修复它(上次他们放弃......)
  • 如果对您有帮助,请接受答案,否则赏金将被浪费(您仍然会失去它)

标签: c# visual-studio dependencies


【解决方案1】:

尝试对 VS2013 做同样的事情。它工作得很好,每次我在 Bar 的文件、运行 Foo(启动项目)中更改某些内容时,都会将最新的文件复制到那里。我只是在写我遵循的步骤,可能是我错过了要复制的东西,或者你错过了一个步骤。请看:

  1. 创建两个项目 Foo 和 Bar
  2. 在 Bar 中创建了一个目录 Libs
  3. 在 Libs 中添加了一个文本文件“TextFile1.txt”
  4. 右键单击 -> 文件属性 -> 复制到输出目录 = 始终复制
  5. 添加了来自 Foo 项目的 Bar 参考
  6. 开始从 Foo 的 Main 方法读取 TextFile 的文本。从 Bin\Debug\Libs 目录读取文件。
  7. 每次按 F5 时,我都会看到最新的文件被复制到那里。

【讨论】:

  • 你的回答不行,我已经遇到过这个问题了。在我的回答中,我放置了一个链接来演示这个问题的解决方案。重建时,文件被复制到 Bar 的输出文件夹,因此“复制到输出目录”为:“始终复制”或“如果更新则复制”。 “复制到输出目录=始终复制”将文件仅复制到 Foo 的输出文件夹,然后 MsBuild 将文件复制到 Bar 的文件夹。在这种情况下,MsBuild 没有进行复制。
【解决方案2】:

除非您重建/清理解决方案,否则 VS 会从输出文件夹中删除文件。 所以我相信你忘了说你的程序(或第三方)这样做了。

首先:this 是类似/确切错误的示例。
下载解决方案并执行以下步骤:

  1. 重建解决方案
  2. 打开Bar的输出文件夹
  3. 文件 cef.pak 将存在于 Libs 中
  4. 按 F5 -> 执行 Bar -> 一切正常
  5. 按 F5 再次执行 -> 您将收到一个文件未找到异常
  6. 如果您重复步骤 1-5,您将收到相同的行为

    • 只有在 Bar 中没有更改并且某些东西(exe / 其他进程 / 等)删除了文件时,才会存在问题。

第二:我已经遇到过这个问题。 当我的一个团队成员报告这个问题时,他收到的回答是“这不是一个错误,而是一个功能”......

据我所知,没有“魔术按钮”可以解决这个问题。

但有几种解决方法:

  1. (和您一样)添加构建前/构建后事件。我建议您在新的构建配置中执行此操作。

  2. 将 Foo 的构建输出文件夹更改为 Bar 输出文件夹。

  3. 在你的代码中添加一个路径替换 if debug:

    #if DEBUG
                cefFilePath = <build output of foo>
    #endif
    
  4. 将文件作为嵌入资源然后解压。

  5. 创建一个扩展\外部程序来处理这个问题。每个项目的文件都保存了这些文件的信息:

  <ItemGroup>
    <None Include="Libs\cef.pak">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>
  </ItemGroup>

应用程序/插件将为您完成这项工作。

我可以提供更多解决方案/变通办法,但我相信您做对了 -> 构建事件。

编辑:

我在链接中更新了我的示例。现在该解决方案包含 3 个解决方法示例。

【讨论】:

    【解决方案3】:

    编辑“Foo.csproj”(确保项目在 VS 中关闭)并添加此添加底部,以代替每个新项目文件中已经存在的注释掉示例(使用您自己的路径):

    <Target Name="AfterBuild">
        <Copy SourceFiles="Libs\cef.pak;Libs\file2.ext" DestinationFolder="..\..\Bar Solution\Bar Project\output" SkipUnchangedFiles="True" OverwriteReadOnlyFiles="True" />
    </Target>
    

    同时编辑“Bar.csproj”,以防万一更改这些文件不会触发 Foo 构建:

    <Target Name="BeforeBuild">
        <Copy SourceFiles="..\..\Foo Solution\Foo Project\Libs\cef.pak;..\..\Foo Solution\Foo Project\Libs\file2.ext" DestinationFolder="output" SkipUnchangedFiles="True" OverwriteReadOnlyFiles="True" />
    </Target>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-04
      • 2012-09-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多