尝试构建一个包含 132 个项目的 Visual Studio 2010 解决方案,这些项目不使用任何文件引用(仅项目引用)。当我构建整个解决方案时,我会遇到很多这样的构建错误:
The type or namespace name 'xxxx' does not exist in the namespace '<namespace name>' (are you missing an assembly reference?)
解决方案中所有项目的目标框架版本是 v3.5。
因此,我开始根据项目构建顺序一个一个地构建项目。在其中一个项目(比如项目 A)上,我在构建输出中获得了以下信息(注意框架版本)。此项目 A 构建成功。当我构建下一个项目时,比如说项目 B,它通过项目引用(而不是文件引用)引用项目 A,然后它会引发上述构建错误。因此,项目 B 似乎是罪魁祸首。
Compile complete -- 0 errors, 54 warnings
<ProjectName> -> <filepath>\<filename>.dll
Microsoft (R) .NET Global Assembly Cache Utility. Version 4.0.30319.1
Copyright (c) Microsoft Corporation. All rights reserved.
B项目详情
解决方案配置为Debug。
- 在项目 B 的引用树中,项目 A 引用的属性显示
1) “运行时版本”为 v2.0.50727。
2)“复制本地”为真。
3)“强名称”为真。
4)“版本”为1.0.xxxx.xx(在项目A的AssemblyInfo.cs中指定)
5)没有“特定版本”键(因为它是项目参考)
- 项目 B 的 AssemblyInfo.cs 有以下内容:
1) [程序集:ComVisible(false)]
2) [程序集:Guid("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx")]
3) [程序集:AssemblyVersion("1.0.xxxx.xx")]
4) [程序集:AssemblyFileVersion("9.0.xxxx.xx")]
- 项目 B 属性具有以下内容:
1)“目标框架”为“.NET Framework 3.5”
2)“输出类型”为“类库”
3)“将警告视为错误”为“无”
我的问题
现在,我所有项目的属性中指定的目标框架是.NET Framework 3.5。
当我的目标框架是 v3.5 时,构建引擎如何使用 v4.0 的 GAC 实用程序?
搜索所有文件以查看是否在某处配置了 .NET 4.0,但找不到它。这似乎是上述问题的潜在根本原因。还是我错过了其他东西?我相信我已经涵盖了通常的嫌疑人。
另外,当两个项目的目标框架版本都是 v3.5 时,为什么项目 B 中的项目 A 引用的运行时版本会说 v2.0.50727?
PS:我尝试删除项目引用并添加其文件引用,但仍然给出相同的构建错误。(这通常在它是一个长名称问题之前起作用,但在这种情况下不是)。
更新 1:
上述构建错误的构建输出是:
Compile complete -- 13 errors, 0 warnings
C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets(1360,9):
warning MSB3258: The primary reference "<project A reference name>" could not be resolved
because it has an indirect dependency on the .NET Framework assembly
"mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=xxxxxxxxxxx"
which has a higher version "4.0.0.0" than the version "2.0.0.0" in the current target framework.
更新 2:
项目 A 的构建后事件命令行具有以下内容,解释了为什么构建使用 v4.0 的 GAC 实用程序!现在我需要弄清楚如何在那里获得 v3.5 Gacutil。我的第二个问题仍然存在。
cd "$(ProjectDir)"
cd ..\..\..\Bin
gacutil.exe /if "$(TargetPath)"