暂存非托管库或资源时的常见做法是将这些资源作为链接添加到项目并将它们设置为复制到输出目录。
从 Visual Studio 2013 开始,这得到了很好的处理,即使它们被引用库 Foo
然后被应用程序 Bar
使用,它们最终也会在 Bar
的输出目录。
不过,对于文件目录而言,情况似乎并非如此。
在这种情况下,我的应用程序似乎仅在重建 时将此文件目录复制到输出目录。然后我不可避免地会执行几个 build 操作,我会注意到 Libs
目录再次为空。然后执行重建,cef.pak
就回来了。
我的解决方案是使用构建步骤 将Libs
目录手动复制到输出目录。虽然我找不到合适的宏来一般地表达即使这个构建步骤是 Foo
的一部分,我还是希望将文件复制到 Bar
(例如 StartUp Project 在 VS 术语中)输出目录。
更新
感谢大家的精彩回答和测试。我应该澄清一下,当中间有一个额外的库级别时,我仍然会看到这个问题。也就是说,应用程序 Bar
引用库 Foo
,它引用库 Other
,这是带有这些链接文件的库。在那种情况下,当 Other
的链接文件被设置为复制到输出目录时,它们似乎只在重建时复制。我对此的解决方案不太理想,即让 Foo
直接引用 Other
。
最佳答案
除非您重建/清理解决方案,否则 VS 会从输出文件夹中删除文件。 所以我相信你忘了说你的程序(或第三方)这样做了。
第一个:this是类似/确切错误的示例。
下载解决方案并执行以下步骤:
- 重建解决方案
- 打开Bar的输出文件夹
- cef.pak 文件将存在于 Libs 中
- 按 F5 -> 执行 Bar -> 一切正常
- 再次使用 F5 执行 -> 你会收到一个文件未找到的异常
如果您重复步骤 1-5,您将收到相同的行为
- 只有当 Bar 没有变化并且某些东西(exe/其他进程/等)删除了文件时,问题才会存在。
第二:我已经遇到过这个问题。 当我的一个团队成员报告这个问题时,他得到的回答是“这不是错误,这是一个功能”......
据我所知,没有“魔术按钮”可以解决这个问题。
但是有几种解决方法:
(像您一样)添加构建前/后事件。我建议您在新的构建配置中执行此操作。
将 Foo 的构建输出文件夹更改为 Bar 输出文件夹。
在您的代码中使用 if debug 添加路径替换:
#if DEBUG cefFilePath = <build output of foo> #endif
将文件作为嵌入资源然后解压。
创建一个扩展\外部程序来处理这个问题。每个项目文件都保留有关这些文件的信息:
<ItemGroup> <None Include="Libs\cef.pak"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </None> </ItemGroup>
应用程序/插件将为您完成这项工作。
我可以提供更多解决方案/解决方法,但我相信您做对了 -> 构建事件。
编辑:
我更新了链接中的示例。现在该解决方案包含 3 个解决方法示例。
关于c# - Visual Studio 不复制链接文件的目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28700668/