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

时间:2009-11-21 17:09:27

标签: visual-studio visual-c++ dll

我有一个依赖外部DLL文件的Visual Studio C ++项目。在构建项目时,如何让Visual Studio自动将此DLL文件复制到输出目录(调试/发布)?

7 个答案:

答案 0 :(得分:87)

在项目中使用post-build操作,并添加命令以复制有问题的DLL。后构建操作是作为批处理脚本编写的。

输出目录可以引用为$(OutDir)。项目目录以$(ProjDir)的形式提供。尝试在适用的情况下使用相对路径,以便您可以复制或移动项目文件夹,而不会破坏构建后的操作。

答案 1 :(得分:36)

$(OutDir)在VS2013中是一个相对路径,所以我不得不将它与$(ProjectDir)结合起来以达到预期的效果:

xcopy /y /d  "$(ProjectDir)External\*.dll" "$(ProjectDir)$(OutDir)"

顺便说一下,您可以通过添加“回声”来轻松调试脚本。在开头,观察构建输出窗口中的扩展文本。

答案 2 :(得分:7)

在尝试将输出dll从一个C ++项目复制到同一解决方案中另一个C#项目的release and debug文件夹时,上面注释部分中的详细信息对我(VS 2013)不起作用。

我必须添加以下post build-action(右键单击具有.dll输出的项目),然后 properties - >配置属性 - >构建事件 - >后期制作活动 - >命令行

现在我添加了这两行来将输出dll复制到两个文件夹中:

xcopy /y $(TargetPath) $(SolutionDir)aeiscontroller\bin\Release
xcopy /y $(TargetPath) $(SolutionDir)aeiscontroller\bin\Debug

答案 3 :(得分:4)

(这个答案只适用于C#而不是C ++,抱歉我误读了原来的问题)

之前我已经通过DLL地狱了。我的最终解决方案是将非托管DLL作为二进制资源存储在托管DLL中,并在程序启动时将它们解压缩到临时文件夹中,并在处理完毕后将其删除。

这个应该成为.NET或pinvoke基础架构的一部分,因为它非常有用....它使您的托管DLL易于管理,无论是使用Xcopy还是作为Project引用更大的Visual Studio解决方案。完成此操作后,您不必担心构建后事件。

更新:

我在另一个答案https://stackoverflow.com/a/11038376/364818

中发布了代码

答案 4 :(得分:2)

project.csproj 文件中添加内置的COPY:

  <Project>
    ...
    <Target Name="AfterBuild">
      <Copy SourceFiles="$(ProjectDir)..\..\Lib\*.dll" DestinationFolder="$(OutDir)Debug\bin" SkipUnchangedFiles="false" />
      <Copy SourceFiles="$(ProjectDir)..\..\Lib\*.dll" DestinationFolder="$(OutDir)Release\bin" SkipUnchangedFiles="false" />
    </Target>
  </Project>

答案 5 :(得分:0)

xcopy /y /d  "$(ProjectDir)External\*.dll" "$(TargetDir)"

您还可以参考相对路径,下一个示例将在项目文件夹上方一层的文件夹中找到DLL。如果您有多个在单个解决方案中使用DLL的项目,则将DLL的源设置为“启动项目”时,会将其放置在可访问的公共区域中。

xcopy /y /d  "$(ProjectDir)..\External\*.dll" "$(TargetDir)"

/y选项未经确认即会复制。 /d选项检查目标文件中是否存在文件,以及是否仅在源文件的时间戳比目标文件新的情况下才复制文件。

我发现,在至少较新的Visual Studio版本(例如VS2109)中,$(ProjDir)是未定义的,而必须使用$(ProjectDir)

xcopy中保留目标文件夹应默认为输出目录。理解原因$(OutDir)本身并没有帮助。

$(OutDir)(至少在最新版本的Visual Studio中)被定义为输出文件夹的相对路径,例如bin/x86/Debug。单独使用它作为目标将从项目输出文件夹开始创建一组新文件夹。例如:… bin/x86/Debug/bin/x86/Debug

将其与项目文件夹结合在一起可以使您到达正确的位置。例如:$(ProjectDir)$(OutDir)

但是$(TargetDir)将一步提供输出目录。

Microsoft's list of MSBuild macros for current and previous versions of Visual Studio

答案 6 :(得分:-1)

我有一个类似的问题。在我的项目中,有几个外部 DLL。所以我在项目中新建了一个名为“lib”的文件夹,并将所有外部dll复制到这个文件夹中。

  1. 添加对这些 DLL 的引用。
  2. 转到 Project References>dll 属性并更改以下属性 enter image description here