我有以下情况:
所以我的问题是:
谢谢,帕维尔
编辑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&项目C.exe。因此,在讨论的场景中,Microsoft.Data.SqlXml不会在OLAF.Generator bin文件夹中结束的原因与该程序集本身有关。
编译器/ visual studio是否知道Microsoft.Data.SqlXml位于自动探测的目录中(或者它在GAC中),这就是为什么不复制该程序集的原因?
编辑2:我刚刚检查了GAC,事实上,Microsoft.Data.SqlXml.dll已安装在GAC中。
答案 0 :(得分:6)
How does Copy-local work? log4net.dll is not being copied to MyProject output directory - 这是我的问题的答案。当库安装在GAC中时,即使使用了COPY LOCAL设置,也不会复制它。
答案 1 :(得分:3)
引用不会自动级联,因此添加对OLAF.Tools的引用 not 也会添加对SQLXML的引用。如果要使用exe部署SQLXML,那么最方便的方法是从你的exe中显式添加对SQLXML 的引用,并将其设置为copy local。没有它,它就不会被部署。基本上,开发人员有责任决定在运行时实际需要哪些文件(这通常是所使用的引用的子集,并且取决于您只能知道的许多部署决策)。
如何在运行时解决它...探测路径有点像黑色艺术,主要是指“app文件夹”,但它取决于配置,实际上可以咨询GAC。您还可以通过AppDomain.Current.AssemblyResolve
提供自己的解析器。