Mat*_*Mat 94 dll visual-studio visual-c++
我有一个依赖外部DLL文件的Visual Studio C++项目.在构建项目时,如何使Visual Studio自动将此DLL文件复制到输出目录(调试/发布)?
Adr*_*son 87
在项目中使用构建后操作,并添加命令以复制有问题的DLL.后构建操作是作为批处理脚本编写的.
输出目录可以引用为$(OutDir).项目目录可用$(ProjDir).尝试在适用的情况下使用相对路径,以便您可以复制或移动项目文件夹,而不会破坏构建后操作.
小智 38
$(OutDir)原来是VS2013中的一个相对路径,所以我不得不将它与$(ProjectDir)结合起来以达到预期的效果:
xcopy /y /d "$(ProjectDir)External\*.dll" "$(ProjectDir)$(OutDir)"
Run Code Online (Sandbox Code Playgroud)
顺便说一句,您可以通过在开头添加"echo"来轻松调试脚本,并在构建输出窗口中观察扩展文本.
Dar*_*ryl 19
要使用 GUI 执行此操作,首先将文件添加到项目中:右键单击项目,选择“添加...”,然后选择“现有项目”,然后浏览到要添加的一个或多个文件,然后单击“添加”。接下来,告诉 Visual Studio 在构建时复制文件:右键单击要复制的文件,选择“属性”。您将看到属性列表,包括“项目类型”。将“项目类型”更改为“复制文件”。点击“确定”即可完成。
这是文件属性对话框:
查看 *.vcxproj 文件,上面的步骤添加如下内容:
<ItemGroup>
<CopyFileToFolders Include="libs\a.dll" />
<CopyFileToFolders Include="libs\a.dll" />
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)
我找不到 <CopyFileToFolders> 的任何官方文档,但显然它是受支持的,否则 GUI 不会使用它。但是,如果您手动执行此操作,并且未记录的项目类型让您感到不舒服,您始终可以使用众所周知但稍微详细的 <Content> 类型:
<ItemGroup>
<Content Include="libs\a.dll" >
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="libs\b.dll" >
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)
当尝试将输出dll从一个C++项目复制到同一解决方案中另一个C#项目的发布和调试文件夹时,上面的注释部分中的详细信息对我(VS 2013)不起作用.
我必须添加以下post build-action(右键单击具有.dll输出的项目)然后属性 - >配置属性 - >构建事件 - >构建后事件 - >命令行
现在我添加了这两行来将输出dll复制到两个文件夹中:
xcopy /y $(TargetPath) $(SolutionDir)aeiscontroller\bin\Release
xcopy /y $(TargetPath) $(SolutionDir)aeiscontroller\bin\Debug
Run Code Online (Sandbox Code Playgroud)
(此答案仅适用于 C# 不适用于 C++,抱歉我误读了原始问题)
我以前也经历过这样的 DLL 地狱。我的最终解决方案是将非托管 DLL 作为二进制资源存储在托管 DLL 中,并在程序启动时将它们提取到一个临时文件夹中,并在处理时将其删除。
这应该是 .NET 或 pinvoke 基础结构的一部分,因为它非常有用......它使您的托管 DLL 易于管理,无论是使用 Xcopy 还是作为更大的 Visual Studio 解决方案中的项目引用。完成此操作后,您不必担心构建后事件。
更新:
我在另一个答案中发布了代码/sf/answers/772686351/
在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>
Run Code Online (Sandbox Code Playgroud)