在同一个解决方案中为同一个项目添加相同的“* .dll”引用

时间:2011-01-14 14:37:24

标签: .net dll gac log4

我有一个Visual Studio 2008 .NET C ++ / CLI解决方案。我的解决方案包含许多子项目。我为每个项目定义了一个自定义的buid目录,称之为Output。

MySoultion

  • MyFirstProject(* .exe)
  • MySecondPrject(* .dll)
  • ...
  • MyNthProject(* .dll)

每个子项目都使用Log4.net。所以我创建了一个目录(称为LogBinary)并将log4.net dll放在该文件夹中。然后使用log4net我添加这个dll作为我的每个项目的引用.. 。 但是当我尝试编译我的主项目(* .exe)时,我收到了大量警告(超过400 ......)

只是一个例子:

  

警告110警告C4945:'AbsoluteTimeDateFormatter':   无法从'somepath \ log4net.dll'导入符号:as   'log4net的:: DateFormatter :: AbsoluteTimeDateFormatter'   已从其他程序集导入'log4net'“somepath \ log4net.dll”

有很多警告
  

已从其他程序集

导入

为什么我收到这个警告?是否有人为多个项目添加相同的dll(使用GAC除外)?

祝福

5 个答案:

答案 0 :(得分:5)

我终于找到了解决这个问题的方法,感觉不像是黑客。我在a response from 'pyro_serv` on the msdn social site中找到了答案:

  

修复是使用每个VC项目引用上的“在构建中使用依赖关系”和“在构建中使用”标志(通过VC属性表),并根据您的情况切换它们以解决此错误。

对于OP的例子看起来像这样:

Solution -> Log4.net
Solution -> Proj1
Solution -> Proj1 -> Log4.net
Solution -> Proj2
Solution -> Proj2 -> Log4.net
...

避免警告的方法是对Use Dependencies in Build的所有引用将Proj1,Proj2,..,Projn设置为false。

我刚用一个演示解决方案对此进行了验证,效果很好 - 我无法相信解决方案有多简单,而且浪费了多少时间才能找到它!

答案 1 :(得分:1)

更改项目的参考,将所有“copy local ...”属性设置为false。

来源:http://developertips.blogspot.com/2008/07/ccli-warning-c4945.html

答案 2 :(得分:0)

我有同样的问题。 它是由以下情况引起的,其中项目依赖于另一个项目:

my_solution -> System.Xaml.dll -> System.dll
my_solution -> System.dll

当我删除对System.dll的引用时(例如),它解决了编译器警告。

答案 3 :(得分:0)

我对这种情况也有同样的警告:

Solution:
 |
 |-> Project1 : Outdir = "C:\out"
 |
 |-> Project2 : Outdir = [default Outdir] // Was wrong in this case
 |
 |-> Project3 : Outdir = "C:\out"

依赖关系如下:

Solution -> Project1
Solution -> Project2 -> (Project1)
Solution -> Project3 -> (Project1, Project2)

将Project2 Outdir修复为“C:\ out”(实际上是预期的,它是一个新创建的项目而忘了更改它)修复了警告。

答案 4 :(得分:0)

我今天又遇到了同样的问题 首先,感谢Jon Cage和他在帖子中的链接文章see above (or below)。 +1!它解决了我的问题。

但是因为我讨厌像toggle them as appropriate for your case这样的东西,除了trial and error之外什么都没有,我做了一些测试,因为我有2个解决方案,每个解决方案都有大量的C ++ / CLI项目。

以下是我的建议和解释:
对于所有人自我创造的'程序集(将本地'设置为true):

  

"共同属性" - > "框架和参考文献" - > "参考文献" - >选择参考   在右侧的财产表 - > "构建属性" - > "在构建中使用依赖关系"
   - (从Jon Cage的链接的msdn论坛文章中复制)

将此参数Use Dependencies In Build设置为" false"通过取消选中。
它可以作为参考转发',参见下面的示例。

技术背景:
- >意思是参考'
方法1:
在我的解决方案SwCore:
A.1.1 network->tools,A.1.2 network->basics
A.2.1 tools->basics
A.3.1 drives->basics,A.3.2 drives->tools,A.3.3 drives->network
A.4.1 ...
使用"在构建中使用依赖关系#34;设置为true,可以省略参考A.1.2,因为它包含在A.2.1中 所有文件都在swcore \ release \
中创建 ==问题:
解决方案DDI:
B.1.1 DDI_hardware->DDI_job,B.1.2 DDI_hardware->drives
B.2.1 DDI_job->basics,B.2.2 DDI_job->toolsB.2.3 DDI_job->job
DDI_job在DDI \ Release \中创建,并使用" U.D.InBuild"设置为true,包括basics 创建DDI_hardware ...并使用" U.D.InBuild"设置为true,包括DDI_job->basics DDI_hardware还引用了SwCore \ Release \
的基础知识 的 ==>>双重参考基础和其他。 VS看到2个文件并且无法意识到它是相同的内容。

方法2:
A.1.1 network->tools,A.1.2 network->basics
A.2.1 tools->basics
与" U.D.InBuild"如果设置为FALSE,则不能省略参考A.1.2,因为它不是从A.2.1转发的 ==有效,因为没有汇编会包含其他更深层次的依赖关系,因此不会发生冲突。

BTW:这会强制您为每个项目指定所有必要的参考,因此您还可以概览项目中使用的内容。

最后信息:如果我的解释是正确的,我无法确定。可能是吧。否则可以确认。