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

我有一个依赖于外部 DLL 文件的 VisualStudioC + + 项目。在生成项目时,如何使 VisualStudio 将此 DLL 文件自动复制到输出目录(debug/release)中?

138066 次浏览

Use a post-build action in your project, and add the commands to copy the offending DLL. The post-build action are written as a batch script.

输出目录可以引用为 $(OutDir)。项目目录可用作 $(ProjDir)。尝试在适当的地方使用相对路径,这样您就可以复制或移动项目文件夹,而不会中断后期构建操作。

(This answer only applies to C# not C++, sorry I misread the original question)

我以前也经历过这样的 DLL 地狱。我的最后一个解决方案是将非托管 DLL 作为二进制资源存储在托管 DLL 中,并在程序启动时将其解压缩到一个临时文件夹中,在程序释放时将其删除。

这个 应该是。NET 或 pcall 基础结构,因为它非常有用... ..。它使您的托管 DLL 易于管理,既可以使用 Xcopy,也可以在较大的 VisualStudio 解决方案中作为 Project 引用。这样做之后,您就不必担心构建后事件了。

更新:

我在这里张贴代码在另一个答案 https://stackoverflow.com/a/11038376/364818

当我试图将输出 dll 从一个 C + + 项目复制到同一解决方案中另一个 C # 项目的发布和调试文件夹时,上面评论部分中的细节对我来说不起作用(VS 2013)。

我必须添加下面的构建后操作(右键单击具有. dll 输出的项目) ,然后添加 properties -> configuration properties -> build events -> post-build event -> command line

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

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

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

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

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

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

也可以引用相对路径,下一个示例将在位于项目文件夹上一级的文件夹中找到 DLL。如果有多个项目在单个解决方案中使用 DLL,则在将其中任何项目设置为启动项目时,都会将 DLL 源放置在可到达的公共区域中。

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

/y选项未经确认复制。 /d选项检查文件是否存在于目标中,以及是否仅在源的时间戳比目标更新时才进行复制。

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

xcopy中省略目标文件夹应该默认为输出目录。这对于理解单独使用 $(OutDir)是没有帮助的原因是很重要的。

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

把它和项目文件夹结合起来应该能让你找到合适的地方。

但是,$(TargetDir)将在一个步骤中提供输出目录。

Microsoft 用于 VisualStudio 当前版本和以前版本的 MSBuild 宏列表

project.csproj文件中添加内置副本:

  <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>

我也有同样的问题。在我的项目中,有几个外部 DLL。因此,我在项目中创建了一个名为“ lib”的新文件夹,并将所有外部 dll 复制到该文件夹。

  1. Add a reference to these DLLs.
  2. 转到 ProjectReferences > dll 属性并更改以下属性 在此输入图像描述

要使用 GUI,首先将文件添加到项目中: 右键单击项目,选择“添加...”,然后选择“现有项”,然后浏览到要添加的文件并单击“添加”。接下来,告诉 VisualStudio 在生成时复制该文件: 右键单击要复制的文件,选择“属性”。您将看到一个属性列表,包括“ Item Type”。将“项目类型”更改为“复制文件”。点击 OK 就可以了。

Here's the file properties dialog:

File Properties Dialog

查看 * . vcxproj 文件,上面的步骤添加如下内容:

<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>