我有一个依赖于外部DLL文件的Visual Studio C++项目。在构建项目时,如何使Visual Studio自动将该DLL文件复制到输出目录(debug/release)中?
在您的项目中使用后构建操作,并添加命令以复制有问题的DLL。后构建操作是编写为批处理脚本。
输出目录可以引用为$(OutDir)
。项目目录可用作$(ProjDir)
。尽可能使用相对路径,在适用的情况下,这样您就可以复制或移动项目文件夹而不会破坏后构建操作。
$(OutDir) 在 VS2013 中是一个相对路径,所以我不得不将其与 $(ProjectDir) 组合起来实现期望的效果:
xcopy /y /d "$(ProjectDir)External\*.dll" "$(ProjectDir)$(OutDir)"
顺便提一句,你可以在脚本开头加上“echo”,然后观察构建输出窗口中的扩展文本来轻松调试脚本。
/f
参数,例如xcopy /y /f
,以获取有关源和目标目录的详细输出。文档:https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/xcopy - MakotoE<ItemGroup>
<CopyFileToFolders Include="libs\a.dll" />
<CopyFileToFolders Include="libs\a.dll" />
</ItemGroup>
我找不到关于<CopyFileToFolders>的官方文档,但显然它是受支持的,否则GUI不会使用它。但是,如果您手动操作并且未经记录的项目类型使您感到不舒服,您始终可以使用众所周知但略微冗长的<Content>类型:
<ItemGroup>
<Content Include="libs\a.dll" >
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="libs\b.dll" >
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
评论区上面的细节对我没有用(在尝试将一个C++项目的输出dll复制到同一解决方案中另一个C#项目的发布和调试文件夹中时,使用VS 2013)。
我不得不添加以下后构建操作(右键单击具有.dll输出的项目,然后选择属性 → 配置属性 → 构建事件 → 后构建事件 → 命令行)
现在我添加了这两行代码以将输出dll复制到这两个文件夹中:
xcopy /y $(TargetPath) $(SolutionDir)aeiscontroller\bin\Release
xcopy /y $(TargetPath) $(SolutionDir)aeiscontroller\bin\Debug
<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>
xcopy /y /d "$(ProjectDir)External\*.dll" "$(TargetDir)"
xcopy /y /d "$(ProjectDir)..\External\*.dll" "$(TargetDir)"
<最初的回答>
/y
选项可以不进行确认就复制文件。
/d
选项检查目标文件是否存在,如果存在,则只有当源文件的时间戳比目标文件新时才会复制。
我发现在较新的Visual Studio版本中(例如VS2019),$(ProjDir)
未定义,必须改用$(ProjectDir)
代替。xcopy
命令中省略目标文件夹会默认使用输出目录。这非常重要,因为单独使用$(OutDir)
是不够用的。$(OutDir)
被定义为相对于输出文件夹的路径,例如bin/x86/Debug
。如果将其作为目标使用,将会创建一个新的文件夹集,从项目输出文件夹开始。例如:… bin/x86/Debug/bin/x86/Debug
。$(ProjectDir)$(OutDir)
。$(TargetDir)
将一步提供输出目录。
Microsoft列出了当前和早期版本的Visual Studio的MSBuild宏列表。我有一个类似的问题。在我的项目中,有几个外部 DLL。因此我创建了一个名为“lib”的新文件夹,并将所有外部 dll 复制到这个文件夹中。
$(TargetDir)
rather than$(OutDir)
- Ouroborus