You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Visual C++2022中如何自动将依赖原生DLL复制到C#项目输出目录

自动复制原生DLL到C#项目输出目录的解决方案

针对VS2022环境下的项目结构(原生C++ DLL项目Project1 → 托管C++程序集Project2 → C# GUI项目Project3),可以通过编辑Project2的.vcxproj文件,利用MSBuild的项目引用机制动态获取Project1.dll路径,将其标记为Content实现自动复制,替代易失效的硬编码Post Build事件。

步骤1:编辑Project2的vcxproj文件

在Project2的.vcxproj文件的<Project>根节点内添加以下MSBuild目标:

<Target Name="IncludeNativeDllAsContent" AfterTargets="ResolveProjectReferences">
  <!-- 获取Project1的输出DLL路径 -->
  <ItemGroup>
    <NativeDllPath Include="$([MSBuild]::GetTargetPath('Project1'))" />
  </ItemGroup>

  <!-- 将原生DLL标记为Content,设置自动复制到输出目录 -->
  <ItemGroup>
    <Content Include="@(NativeDllPath)">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <Link>%(FileName)%(Extension)</Link>
    </Content>
  </ItemGroup>
</Target>

步骤2:确认Project2对Project1的引用配置

如果Project2已引用Project1,检查项目引用节点是否包含<GetTargetPath>true</GetTargetPath>,确保MSBuild能正确获取Project1的输出路径:

<ProjectReference Include="..\Project1\Project1.vcxproj">
  <Project>{替换为Project1的实际GUID}</Project>
  <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
  <Private>true</Private>
  <GetTargetPath>true</GetTargetPath>
</ProjectReference>

原理说明

  • AfterTargets="ResolveProjectReferences"确保目标在解析完所有项目引用后执行,此时Project1的输出路径已被MSBuild自动解析。
  • $([MSBuild]::GetTargetPath('Project1'))通过MSBuild内置函数调用Project1的GetTargetPath目标,动态获取其输出DLL的完整路径,无需硬编码固定路径。
  • 将Project1.dll标记为Content并设置CopyToOutputDirectory=PreserveNewest,会让Project2构建时自动将该DLL复制到自身输出目录;Project3引用Project2时,VS会自动同步Project2的Content文件到Project3的输出目录,最终实现Project1.dll随Project2.dll一同复制到Project3.exe的输出目录。

内容的提问来源于stack exchange,提问作者Drolevar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 18:42:46