Visual Studio不复制链接文件的目录

时间:2015-02-24 16:08:41

标签: c# visual-studio dependencies

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

从Visual Studio 2013开始,处理得相当好,即使它们被引用为库Foo,然后由应用程序Bar使用,它们最终会在Bar&# 39;输出目录。

但是,对于文件目录来说,情况似乎并非如此。

Referenced file in library

在这种情况下,我的应用程序似乎只将此文件目录复制到 rebuild 上的输出目录。然后我不可避免地会做一些构建操作,并且我会注意到Libs目录再次为空。然后执行重建并返回cef.pak

我的解决方案是使用 Build Step 手动将Libs目录复制到输出目录。虽然我找不到合适的宏来一般表达,即使这个构建步骤是Foo的一部分,我希望将文件复制到Bar&#39;(例如 StartUp Project < / em>在VS术语中)输出目录。

更新

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

3 个答案:

答案 0 :(得分:3)

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

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

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

    • 仅当Bar中没有任何更改(exe /其他进程/等)删除了文件时,问题才存在。
  8. 第二:我已经遇到过这个问题。 当我的一个团队成员报告这个问题时,他收到的回答是一种&#34;它不是一个错误,它是一个特色&#34; ....

    据我所知,没有&#34;魔术按钮&#34;解决这个问题。

    但有几种解决方法:

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

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

    3. 使用if debug:

      在代码中添加路径替换
      #if DEBUG
                  cefFilePath = <build output of foo>
      #endif
      
    4. 将文件作为嵌入资源,然后将其解压缩。

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

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

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

      我可以提供更多解决方案/解决方法,但我相信你做对了 - &gt;建立活动。

      修改

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

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

<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>