将间接引用的程序集复制到输出目录 - 缺少程序集

15
可能是重复的问题:
如何使用Copy-local? 我有以下情况:
- 有一个名为OLAF.Tools的项目,该项目引用位于C:\Program Files\SQLXML 4.0\bin\Microsoft.Data.SqlXml.dll中的Microsoft.Data.SqlXml。 引用“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所在的目录?
谢谢,Pawel
编辑1:(在得到Marc Gravell的回答后)
@Marc Gravell: 您的答案让我深思。我可以保证,我总能在主应用程序的bin目录中看到间接依赖的程序集。 我不同意您的看法 - 尽管我尊重您 :)
当然,引用并不会物理级联(我们正在谈论与类、接口等的强关系) - 这正是我构建OLAF.Tools库时想要实现的。 那个库提供了一层抽象,它包含了工厂,而一个工厂接受字符串作为参数并返回接口。该接口的一个特定实现使用Microsoft.Data.SqlXml组件。结果,OLAF.Generator使用位于OLAF.Tools中的接口,但不知道Microsoft.Data.SqlXml中的组件。除此之外(我想我们都知道我在上段所解释的内容),在构建应用程序时,依赖程序集应该被复制(如果“复制本地”设置为TRUE)。我刚刚写了一个示例应用程序,项目B库引用项目A库,而项目C(控制台应用程序)引用项目B。在项目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.

1
Occam's razor认为您实际上并不依赖于SqlXml程序集。因为它没有被复制。而且,因为它在没有它的情况下运行良好。请检查它是否已安装在GAC中。 - Hans Passant
关于您的编辑:您是使用项目引用(它可以检查需要的内容,并且看起来它将包含必要的文件),还是使用文件引用(它看起来不能并且不会)? - Marc Gravell
OLAF.Tools使用文件引用到ProgramFiles SqlXml dll,而OLAF.Generator使用项目引用到OLAF.Tools,在OLAF.Tools输出bin文件夹中,我可以看到OLAF.Tools.dll和Microsoft.Data.SqlXml.dll,而在OLAF.Generator输出bin中,我只能看到OLAF.Generator.exe和OLAF.Tools.dll - Microsoft.Data.SqlXml.dll缺失。 - dragonfly
2个回答

6

3
参考并不会自动级联,因此将 OLAF.Tools 添加为参考项并不会同时添加 SQLXML 为参考项。如果您想要部署 SQLXML 到您的可执行文件中,则最方便的方法是从您的可执行文件中明确地添加对 SQLXML 的参考,并设置它为复制本地。如果没有这样做,则不会进行部署。基本上,开发人员需要决定哪些文件在运行时实际上是必需的(通常是引用使用的子集),并且这取决于许多部署决策,这只有您自己知道。
关于它如何在运行时解决...探测路径有点黑科技,主要是指 "应用程序文件夹",但这取决于配置,实际上 GAC 也可能会被查询。您还可以通过 `AppDomain.Current.AssemblyResolve` 来提供自己的解析器。

谢谢Marc!请查看我添加到问题中的“EDIT 1”注释。 - dragonfly

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接