Visual Studio:将依赖的 DLL 复制到目标文件夹

Posted

技术标签:

【中文标题】Visual Studio:将依赖的 DLL 复制到目标文件夹【英文标题】:Visual Studio: copy dependent DLLs to target folder 【发布时间】:2011-02-10 10:36:16 【问题描述】:

我意识到这个问题以前曾被问过 - 但没有一个答案适用于我的具体案例:

我有一个包含本机 C++ EXE 项目的解决方案,该项目又依赖于 40 多个本机 C++ DLL 项目(在同一解决方案中)。

EXE 项目具有通常的 DebugRelease(和 Profile)配置,但由于它们的源代码库相同用于构建三个不同的应用程序(比如 A1A2A3)。此外,它针对 x32 和 x64,因此总共有 3 x 3 x 2 = 18 个项目配置。

DLL 项目由所有三个目标应用程序共享,因此只有 3 个(DebugReleaseProfile)乘以 2 (x32, x64) = 6 种配置。

由于 EXE 项目依赖于 DLL,因此每当修改 DLL 项目的相关输出时,都需要将其复制到其目标文件夹(或其子文件夹)。

您将如何处理 DLL 的更新?

每个 DLL 项目中的构建后操作不起作用(很好),因为它必须将 DLL 复制到 A1A2 的相关输出文件夹A3。输出文件夹中的任何更改都会导致必须修改 50 个 DLL 项目中的每个项目中的构建后操作。

我目前将 DLL 本身作为项目项添加到 EXE 项目中,并配置了自定义构建工具以将其复制到输出文件夹。但这需要我将每个 DLL 添加 6 次,所以我最终得到 6 x 50 = 300 个 DLL!

我真正需要的是像“复制本地”选项这样的东西,不幸的是它只适用于程序集。您是否建议简化此构建设置的解决方案?

【问题讨论】:

【参考方案1】:

我要做的是将所有 DLL 放在一个文件夹中(特定于 Debug/Release 等),然后将它们复制回 EXE 的相应输出文件夹。

这只能通过两个动作来完成:

将所有DLL的输出目录设置为$(ConfigurationName)_$(PlatformShortName)之类的文件夹

选择所有 DLL 项目 右键单击 -> 属性 选择所有配置和所有平台 设置输出目录

向 EXE 项目添加构建后操作,该操作适用于将 $(ConfigurationName)_$(PlatformShortName)\*.dll 复制到 $(TargetDir) 的所有配置

编辑

第二步出现问题,因为您的 EXE 的 $(ConfigurationName) 与您的 DLL 项目不同。不确定,但也许您可以有一种方法来推断相应的配置,以便您的所有 18 个配置仍然有一个构建后事件。这可能是一个新的 SO 问题:)

【讨论】:

太棒了!为什么我以前没有考虑过? 是的,我注意到了。但这是可以管理的 - 它只是意味着会有三个稍微不同的构建后操作。【参考方案2】:

这适用于 VisualStudio 2019(也可能是以前的版本,但未尝试过)

我尝试了几种方法,这是最好的折衷方案:

复制到最终的目标文件夹(最重要的!) 复制到项目 bin 文件夹中 出现在 VS 项目视图中 可以有不同的 x64/x86 文件 可重命名(标签Link

编辑您的 *.vcxproj 文件并像其他任何内容一样添加此 ItemGroup

<ItemGroup>
  <None Include="MyDllFolder\myDll.dll" CopyToOutputDirectory="PreserveNewest" Link="myDll.dll"/>

  <!-- x86/x64 different dlls -->
  <None Include="MyDllFolder\x86\myDll2_x86.dll" Link="myDll2_x86.dll">
    <CopyToOutputDirectory Condition="$(PlatformTarget) == x86">PreserveNewest</CopyToOutputDirectory>
  </None>
  <None Include="MyDllFolder\x64\myDll2_x64.dll" Link="myDll2_x64.dll">
    <CopyToOutputDirectory Condition="$(PlatformTarget) == x64">PreserveNewest</CopyToOutputDirectory>
  </None>
</ItemGroup>

灵感来自Automatic copy files to output during application building

【讨论】:

以上是关于Visual Studio:将依赖的 DLL 复制到目标文件夹的主要内容,如果未能解决你的问题,请参考以下文章

如何让 Visual Studio 将 DLL 文件复制到输出目录?

如何防止引用程序集的嵌入式依赖项被复制到Visual Studio中的输出文件夹?

在 Visual Studio 2013 中添加对您自己的 DLL 项目的依赖项/引用

visual studio2013如何查看exe或dll依赖于哪些dll depends

如何在 Visual Studio 中设置 DLL 文件的路径?

Visual Studio 发布未将所有 DLL 复制到发布文件夹