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


101

我有一个依赖于外部DLL文件的Visual Studio C ++项目。生成项目时,如何使Visual Studio自动将此DLL文件复制到输出目录(调试/发行版)中?

Answers:


90

在项目中使用生成后操作,然后添加命令以复制有问题的DLL。构建后操作将作为批处理脚本编写。

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


25
还值得指出的是,他可以通过“项目”>“属性”>“构建事件”>“构建后事件”来设置构建后事件。
Phil Booth


36
在情况下,链接永远休息:“XCOPY / Y “$(PROJECTDIR)* DLL” “$(OUTDIR)”。
王牌

我将以上内容更改为在实例中个人使用命令的方式。这将; 复制具有源代码管理功能的只读文件,并创建目标目录(通常不需要)。-> xcopy“ $(ProjectDir)*。dll”“ $(OutDir)” / i / r / y
在Joes

8
将/ d标志添加到xCopy,以防止不必要地重新复制输出目录中未更改的文件。
Zoey 2014年

43

$(OutDir)在VS2013中被证明是相对路径,因此我不得不将其与$(ProjectDir)结合使用以实现所需的效果:

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

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


3
$(TargetDir)可以替换$(ProjectDir)$(OutDir),因为它还是两者的组合。
person27年

在没有/ d的情况下,它会抛出“访问被拒绝”错误。但是/ d根据文档是日期。不确定连接是什么。
拉维C

1
如果源文件较旧或与现有文件相同,则添加/ d可以防止覆盖。如果目标被另一个进程锁定,则可能会发生拒绝访问错误。
Rich Shealer

7

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

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

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

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

5

(此答案仅适用于C#,不适用于C ++,对不起,我误读了原始问题)

我以前已经通过DLL地狱了。我的最终解决方案是将非托管DLL作为二进制资源存储在托管DLL中,并在程序启动时将其提取到一个临时文件夹中,并在处理该程序时将其删除。

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

更新:

我在另一个答案https://stackoverflow.com/a/11038376/364818中在这里发布了代码


1
我同意,它应该是框架的一部分(以静态链接dll等)-值得注意的是,将dll存储为资源,然后在运行时提取它可能会在某些公司环境中引起问题(尤其是如果它们具有主动防病毒软件)。
BrainSlugs83

1

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>

VS有一个长期的错误,请使用ProjectDir而不是SolutionDir
John_J

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的Visual Studio当前版本和以前版本的MSBuild宏列表

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.