【发布时间】:2011-10-12 11:28:31
【问题描述】:
我有以下情况:
- 有一个名为 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