我有一个Visual Studio 2008 .NET C ++ / CLI解决方案。我的解决方案包含许多子项目。我为每个项目定义了一个自定义的buid目录,称之为Output。
MySoultion
每个子项目都使用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除外)?
祝福
答案 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->tools
,B.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:这会强制您为每个项目指定所有必要的参考,因此您还可以概览项目中使用的内容。
最后信息:如果我的解释是正确的,我无法确定。可能是吧。否则可以确认。