暂存非托管库或资源时的一种常见做法是将这些资源添加为项目的链接,并将它们设置为复制到输出目录。
从Visual Studio 2013开始,处理得相当好,即使它们被引用为库Foo
,然后由应用程序Bar
使用,它们最终会在Bar
&# 39;输出目录。
但是,对于文件目录来说,情况似乎并非如此。
在这种情况下,我的应用程序似乎只将此文件目录复制到 rebuild 上的输出目录。然后我不可避免地会做一些构建操作,并且我会注意到Libs
目录再次为空。然后执行重建并返回cef.pak
。
我的解决方案是使用 Build Step 手动将Libs
目录复制到输出目录。虽然我找不到合适的宏来一般表达,即使这个构建步骤是Foo
的一部分,我希望将文件复制到Bar
&#39;(例如 StartUp Project < / em>在VS术语中)输出目录。
更新
谢谢大家的精彩答案和测试。我应该澄清一下,当中间有一个额外的库时,我仍然会看到这个问题。也就是说引用库Bar
的引用Foo
引用库Other
,这是与这些链接文件相关的库。在这种情况下,当Other
的链接文件设置为复制到输出目录时,它们似乎只在重建时进行。我对此的解决方案不太理想,即直接Foo
引用Other
。
答案 0 :(得分:3)
除非您重建/清理解决方案,否则VS会从输出文件夹中删除文件。 所以我相信你忘了说你的程序(或第三方)这样做了。
首先:this是类似/确切错误的示例 下载解决方案并执行以下步骤:
如果您重复步骤1-5,您将收到相同的行为
第二:我已经遇到过这个问题。 当我的一个团队成员报告这个问题时,他收到的回答是一种&#34;它不是一个错误,它是一个特色&#34; ....
据我所知,没有&#34;魔术按钮&#34;解决这个问题。
但有几种解决方法:
(正如您所做)添加前/后构建事件。我建议您在新的构建配置中执行此操作。
将Foo的构建输出文件夹更改为Bar输出文件夹。
使用if debug:
在代码中添加路径替换#if DEBUG
cefFilePath = <build output of foo>
#endif
将文件作为嵌入资源,然后将其解压缩。
创建一个扩展\外部程序来处理这个问题。每个项目文件都保存有关这些文件的信息:
<ItemGroup> <None Include="Libs\cef.pak"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </None> </ItemGroup>
应用程序/插件将为您完成工作。
我可以提供更多解决方案/解决方法,但我相信你做对了 - &gt;建立活动。
修改强>
我在链接中更新了我的示例。现在该解决方案包含3个解决方法示例。
答案 1 :(得分:2)
尝试与VS2013一样。它工作得很好,每当我在Bar的文件,Run Foo(启动项目)中更改某些内容时,最新的文件都会复制到那里。我只是在写我所遵循的步骤,可能是我错过了要复制的东西,或者你错过了一步。请看一下:
答案 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>