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

标签 c# visual-studio dependencies

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

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

不过,对于文件目录而言,情况似乎并非如此。

Referenced file in library

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

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

更新

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

最佳答案

除非您重建/清理解决方案,否则 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 个解决方法示例。

关于c# - Visual Studio 不复制链接文件的目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28700668/

相关文章:

c# - Web API 2 返回文本/纯文本响应

perl - 强制本地安装的模块使用本地安装的依赖项

security - 如何更新 package-lock.json 中的依赖项

c# - WebClient 下载文件损坏

c# - 如何将图表从 teechart 库添加到现有布局

c# - 字符串的双引号问题

visual-studio-2010 - NuGet 没有丢失包

c++ - 如何在 Linux 平台的 Visual Studio c++ 中编写 GTK 应用程序?

android - 为什么存在 Google maven 存储库,我应该在什么时候使用它?

c# - 无论我做什么,都会出现 "The remote server returned an error: (403) Forbidden"错误