2015-02-24 124 views
1

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

由于Visual Studio的2013年,这是处理得很好,即使它们被引用的库Foo然后由应用Bar消耗,他们将在Bar的输出目录中结束。

尽管对于文件目录来说,它也不是这样。

Referenced file in library

在这种情况下,我的应用程序似乎只有文件的这个目录复制到输出目录上只有重建。然后难免我会做几个构建的行动,我会注意到Libs目录又是空的。然后做一个重建cef.pak又回来了。

我的解决方案是使用构建步骤手动将Libs目录复制到输出目录。虽然我无法找到适当的宏来一般表示,即使此构建步骤属于Foo的一部分,我也希望将这些文件复制到Bar(例如,以VS形式的启动项目)输出目录。

更新

谢谢你的伟大的答案大家和测试这一点。我应该澄清一点,如果两者之间存在额外级别的库,我仍然会看到这个问题。也就是说参考库Foo的应用Bar其参考库Other这是具有这些链接文件的那个。在这种情况下,当Other的链接文件被设置为复制到输出目录时,它们似乎只能在重建时进行。我对此的解决方案并不尽如人意,它直接使用Foo参考Other

+0

我面临这个问题(阅读我的回答)如果你想要更多的解决方案添加评论,我会提供你请提交bug给微软,也许他们会修复它(上次他们放弃...) – 2015-03-08 10:38:53

+0

接受一个答案,如果它帮助你,或者赏金将被浪费(你仍然会丢掉它) – 2015-03-10 18:00:33

回答

3

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

第一个:this是一个类似/确切的错误的例子。
下载解决方案并执行以下步骤:

  1. 重新生成解决方案
  2. 开酒吧
  3. 的输出文件夹中的文件cef.pak将在利布斯被存在
  4. 按F5 - >执行酒吧 - >一切都好
  5. 与F5再次执行 - >您将收到一个文件未发现异常
  6. 如果重复步骤1-5,您将收到相同的是行为

    • 只有Bar没有变化,并且某些东西(exe/other process/etc)已经删除了该文件,问题才存在。

第二:我已经遇到过这个问题。 当我的一个团队成员报告了这个问题,那么他收到的答案是“这不是一个功能的bug”......

据我所知,没有“魔法按钮”来解决对于这个问题。

但有几个解决方法:

  1. (像你一样)将前/后生成事件。我建议你在新的构建配置中执行此操作。

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

  3. 在代码中添加路径替换如果调试:

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

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

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

应用/插件会为你做这项工作。

我可以提供更多解决方案/解决方法,但我相信您做了正确的事情 - >构建事件。

编辑:

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

2

尝试与VS2013做同样的事情。它工作得很好,每当我改变Bar的文件,Run Foo(启动项目)中的某些内容时,最新的文件就被复制到那里。我只是写我遵循的步骤,可能是我错过了某些东西来复制或者错过了一个步骤。请看看:

  1. 创建两个项目Foo和Bar
  2. 在利布斯
  3. 在酒吧创建的目录利布斯
  4. 添加一个文本文件“TextFile1.txt”
  5. 右键 - >属性>复制到输出目录=复制总是
  6. 添加Foo项目的Bar引用
  7. 从Foo的Main方法开始读取TextFile的文本。从Bin \ Debug \ Libs目录中读取文件。
  8. 每当我按F5我看到最新的文件被复制到那里。
+0

你的回答不起作用,我已经遇到了这个问题。在我的回答中,我提出了解决方案的链接来展示这个问题。在重建文件被复制到输出Bar的文件夹时,所以“复制到输出目录”是:“始终复制”或“如果新的复制”。 “复制到输出目录=复制总是”将只复制文件到Foo的输出文件夹,然后MsBuild将文件复制到酒吧文件夹。在这种情况下,MsBuild没有做这个副本。 – 2015-03-08 10:31:35

1

编辑“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”为好,以防万一改变这些文件不会触发富建:

<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> 
相关问题