【问题标题】:Copying indirectly referenced assembly to output directory - assembly is missing [duplicate]将间接引用的程序集复制到输出目录 - 程序集丢失 [重复]
【发布时间】:2011-10-12 11:28:31
【问题描述】:

可能重复:
How does Copy-local work?

我有以下情况:

  • 有一个名为 OLAF.Tools 的项目,该项目引用了 C:\Program Files\SQLXML 4.0\bin\Microsoft.Data.SqlXml.dll 中的 Microsoft.Data.SqlXml。 Reference Copy Local 属性设置为 True。当我在 bin 目录中构建该项目时,我可以同时看到 OLAF.Tools.dll 和 Microsoft.Data.SqlXml.dll
  • 有一个名为 OLAF.Generator 的控制台应用程序,该应用程序引用了 OLAF.Tools(我已使用 Project 选项卡添加了引用)。当我在 bin 目录中构建该应用程序时,我只能看到 OLAF.Generator.exe 和 OLAF.Tools.dll - 没有 Microsoft.Data.SqlXml.dll,这让我大吃一惊。另一个奇怪的事情是,即使缺少该 dll,应用程序仍在正常执行。

所以我的问题是:

  • 为什么没有将 Microsoft.Data.SqlXml.dll 复制到 OLAF.Generator 控制台应用程序的 bin 文件夹中?
  • 应用程序如何解析可以找到 Microsoft.Data.SqlXml.dll 的目录?

谢谢,帕维尔

编辑 1:(在 Marc Gravell 回复后)

@Marc Gravell:您的回答让我深思,因为我可以发誓我总是可以在主应用程序的 bin 目录中看到间接依赖的程序集。恕我直言,我不同意你的看法——恕我直言:)

当然,引用不是物理级联的(我们正在谈论与类、接口等的强关系)——这正是我在构建 OLAF.Tools 库时想要实现的。该库提供了一个抽象级别,它包含工厂,一个工厂接受作为参数字符串并返回接口。该接口的一个特定实现使用 Microsoft.Data.SqlXml 组件。因此, OLAF.Generator 使用位于 OLAF.Tools 中的接口,但不了解 Microsoft.Data.SqlXml 中的组件。

除此之外(我想我们都知道我在上一段中试图解释的内容),在构建应用程序时,应该复制依赖程序集(如果 Copy Local 设置为 TRUE)。我刚刚编写了示例应用程序,Project B lib 引用了 Project A lib,Project C(控制台应用程序)引用了 Project B。在 Project C 的 bin 目录中,我可以看到所有:Project A.dll、Project B.dll & Project C.exe。所以在讨论的场景中,Microsoft.Data.SqlXml 没有最终出现在 OLAF.Generator bin 文件夹中的原因与该程序集本身有关。

编译器/Visual Studio 是否知道 Microsoft.Data.SqlXml 位于自动探测的目录中(或者它在 GAC 中),这就是不复制该程序集的原因?

编辑 2:我刚刚检查了 GAC,确实,Microsoft.Data.SqlXml.dll 安装在 GAC 中。

【问题讨论】:

  • 奥卡姆剃刀说您实际上并不依赖于 SqlXml 程序集。因为它没有被复制。 并且 因为没有它它运行良好。请检查它是否安装在 GAC 中。
  • 重新编辑:您是否使用 project 参考(由此它可以检查需求,并且看起来它包含必要的文件) ,或者它是一个 file 引用(因此它看起来不能也没有)?
  • OLAF.Tools 使用对 ProgramFiles SqlXml dll 的文件引用,而 OLAF.Generator 使用对 OLAF.Tools 的项目引用,在 OLAF.Tools 输出 bin 文件夹中我可以看到 OLAF.Tools.dll 和 Microsoft。 Data.SqlXml.dll,而在 OLAF.Generator 输出箱中我只能看到 OLAF.Generator.exe 和 OLAF.Tools.dll - Microsoft.Data.SqlXml.dll 丢失

标签: c# .net visual-studio msbuild


【解决方案1】:

How does Copy-local work? log4net.dll is not being copied to MyProject output directory - 这是我的问题的答案。在 GAC 中安装库时,即使使用 COPY LOCAL 设置,也不会被复制。

【讨论】:

    【解决方案2】:

    引用不会自动级联,因此添加对 OLAF.Tools 的引用不会也添加对 SQLXML 的引用。如果您想使用您的 exe 部署 SQLXML,那么最方便的方法是显式添加对 SQLXML from 的引用,并将其设置为复制本地。没有这个,它就不会被部署。基本上,开发人员有责任决定在运行时实际需要哪些文件(这通常是所使用参考的子集,并且取决于许多只有您才能知道的部署决策)。

    关于如何在运行时解决它......探测路径有点像魔法,主要是“应用程序文件夹”,但这取决于配置,确实可以咨询 GAC。您还可以通过AppDomain.Current.AssemblyResolve 提供自己的解析器。

    【讨论】:

    • 谢谢马克!请检查我的 EDIT 1 note added to question。
    猜你喜欢
    • 2018-10-28
    • 1970-01-01
    • 2011-10-07
    • 2018-05-26
    • 1970-01-01
    • 1970-01-01
    • 2010-09-21
    • 2011-01-01
    相关资源
    最近更新 更多