【问题标题】:How to prevent a referenced assembly's embedded dependency from being copied to output folder in Visual Studio?如何防止引用程序集的嵌入式依赖项被复制到 Visual Studio 中的输出文件夹?
【发布时间】:2018-06-14 08:23:41
【问题描述】:

我有:

  1. A.dll - 第三方程序集
  2. B.dll - 我自己的类库程序集
  3. C.exe - 我自己的可执行文件

我正在使用Costura.Fody NuGet packageA.dll 嵌入到 B.dll 中,并且 C.exe 具有对B.dll

(A.dll 嵌入到 B.dll 中)

然而,当我构建 C.exe 时,A.dll 出现在输出文件夹中,尽管它已经嵌入到 B.dll(也被复制到输出文件夹)中。我不希望将本质上是两个 A.dll 副本与我的可执行文件一起分发,但我想将 A & B 作为一个分发。

在 B.dll 中,A.dll 的“复制本地”属性设置为 false,而是明确包含在 Costura 的 FodyWeavers.xml 中。

有什么方法可以配置 Costura.Fody 和/或我的引用属性,以便 A.dll 不会被独立复制到 C.exe 的输出文件夹中,而 B.dll(带有对 A.dll 的嵌入式引用)是抄袭?

【问题讨论】:

  • 看看here.
  • Copy Local = False 本身应该足以防止 A.dll 被复制到 B 构建目录。这反过来又阻止了 msbuild 在构建 C 时找到 A。它根本不应该寻找它,因为 A 不应再出现在 B 的清单中。这里出了不止一件事。您至少必须深入挖掘详细的 msbuild 跟踪,以了解它是如何设法找到它的。或者只是不打扰机器,唯一重要的是您部署到用户或生产机器的内容。
  • 感谢 Hans 将我推荐给 msbuild 跟踪。 Msbuild 在 Program Files 中找到 A 是因为我很久以前就将它复制到那里了。

标签: c# dll reference visual-studio-2017 fody-costura


【解决方案1】:

据我所知,您需要避免的参考程序集。

【讨论】:

  • 是的,C.exe 需要 A.dll 才能正常运行。但我对当前情况的问题是 A.dll 在技术上已经包含在对 B.dll 的引用中,因为它是嵌入的,但它仍然在本地复制。即使我从输出文件夹中删除 A.dll,C.exe 也能正常工作,所以我想一开始就不让它出现在那里。
  • 考虑从 Visual Studio 项目生成的 B.dll。在那个项目中,如果您添加了 C.dll 的引用,那么 B 的 bin 文件夹中肯定会有 C.dll。因此,如果 A.dll 有 B 的引用,它会自动将 C 作为默认行为。从我所做的工作来看,子父级 Dll 不断增加。您可以使用第三方 NuGet 来避免这种情况,但构建将再次增加一个任务来解压父 Dll,并使构建时间变慢。
【解决方案2】:

参考msbuild跟踪日志后,我发现C.exe正在解析Program Files中的A.dll路径。从 Program Files 中删除 A.dll 解决了我的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-28
    • 1970-01-01
    • 2018-08-15
    • 2011-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多