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

如何在Visual Studio中阻止被引用程序集的嵌入依赖复制到输出文件夹?

解决Costura.Fody嵌入后A.dll仍被复制到C.exe输出目录的问题

我来帮你搞定这个问题——你已经做了大部分正确的配置,还差几个关键步骤就能让A.dll完全藏在B.dll里,不会单独出现在C.exe的输出文件夹:

1. 彻底移除C.exe对A.dll的直接/间接引用

首先检查你的C.exe项目:如果它直接引用了A.dll,哪怕B.dll已经嵌入了A,Visual Studio还是会把A.dll复制到输出目录。你需要:

  • 在C.exe的引用列表里找到A.dll,右键删除它
  • 打开C.exe的.csproj文件,搜索<Reference Include="A",如果有相关条目,直接删掉

有时候VS会因为B.dll依赖A.dll,自动在C.exe的项目里添加对A的隐式引用,所以手动检查项目文件很重要。

2. 强化B.dll的Costura配置

你已经在FodyWeavers.xml里显式包含了A.dll,再确认下配置格式是否正确:

<Weavers>
  <Costura>
    <IncludeAssemblies>A</IncludeAssemblies>
    <!-- 如果A是强命名程序集,也可以加上版本号,比如A, Version=1.0.0.0 -->
  </Costura>
</Weavers>

同时确保B.dll项目里对A.dll的引用:

  • Copy Local设为False
  • Specific Version可以设为True(避免版本混乱)

3. 用MSBuild规则强制阻止A.dll复制到C.exe输出

如果上面两步做完还是有A.dll出现在输出目录,直接在C.exe的.csproj文件里添加以下配置,从输出中排除A.dll:

<!-- 移除A.dll的复制规则 -->
<ItemGroup>
  <Content Remove="A.dll" />
  <CopyToOutputDirectory Remove="A.dll" />
  <Reference Remove="A" />
</ItemGroup>

<!-- 或者在构建完成后删除A.dll -->
<Target Name="CleanupAFromOutput" AfterTargets="PostBuildEvent">
  <Delete Files="$(OutputPath)A.dll" />
  <Delete Files="$(OutputPath)A.pdb" /> <!-- 如果有pdb文件也一起删 -->
</Target>

4. 验证嵌入是否生效

最后做个验证:

  • 用ILSpy或dnSpy打开B.dll,查看它的资源节点,应该能看到Costura.Assemblies.A.dll这样的嵌入资源
  • 运行C.exe,确认程序能正常工作,不会抛出FileNotFoundException找不到A.dll

这样配置后,你就只需要分发C.exe和B.dll,A.dll会完全嵌入在B.dll里,不会单独出现。

内容的提问来源于stack exchange,提问作者Ryan K.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:05:23