正在将间接引用的程序集复制到输出目录-缺少程序集
本文关键字:程序集 输出 复制 引用 | 更新日期: 2023-09-27 18:11:14
可能重复:
Copy如何在本地工作?
我有以下情况:
- 有一个名为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的目录
谢谢,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目录中,我可以看到所有内容:项目A.dll、项目B.dll&因此,在所讨论的场景中,Microsoft.Data.SqlXml没有出现在OLAF.Generator bin文件夹中的原因与该程序集本身有关。
编译器/visual studio是否知道Microsoft.Data.SqlXml位于自动探测的目录中(或位于GAC中(,这就是不复制该程序集的原因?
第2版:我刚刚检查了GAC,而且GAC中确实安装了Microsoft.Data.SqlXml.dll。
Copy如何在本地工作?log4net.dll没有被复制到MyProject输出目录-这是我的问题的答案。当库安装在GAC中时,即使使用了COPY LOCAL设置,也不会复制它。
引用不会自动级联,因此添加对OLAF的引用。Tools不会添加对SQLXML的引用。如果你想用你的exe部署SQLXML,那么最方便的方法是从你的exe显式添加对SQLXML的引用,并将其设置为本地复制。没有这一点,它就无法部署。基本上,开发人员有责任决定运行时实际需要的文件(这通常是所使用引用的子集,取决于许多只有您才能知道的部署决策(。
关于如何在运行时解决。。。探测路径有点像黑艺术,主要意思是"应用程序文件夹",但这取决于配置,实际上可能会咨询GAC。您还可以通过AppDomain.Current.AssemblyResolve
提供自己的解析器。