从4.0升级到4.5后,MSBuild无法再找到依赖项?

Rac*_*hel 6 c# msbuild csc .net-3.5 .net-4.5

我们有一个.Net 3.5应用程序,它是使用一些调用的脚本构建的 msbuild.exe

最近我们所有的机器都开始自动从.Net 4.0更新到.Net 4.5作为公司范围内的政策的一部分,我们的构建脚本开始失败.

给出的错误是他们找不到引用的程序集,如下所示:

error CS0012: The type 'System.Drawing.Image' is defined in an assembly that is not referenced. 
You must add a reference to assembly 'System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'.

看起来在每种情况下,我们都尝试构建具有对项目B的引用的项目A,并且项目B具有对库X的引用,并且获得项目A需要对库X的引用的错误.

一个临时的解决方法是卸载4.5,卸载4.0,然后重新安装4.0,但这是耗时的,并且在更新通常是静默和自动的环境中不实用.

我已经尝试过使用以下msbuild交换机,没有运气

  • /toolsversion:3.5- Func未定义的例外情况
  • /toolsversion:4.0 - 因为4.5替换了4.0工具不起作用
  • /p:TargetFrameworkVersion="v3.5" - 同样的错误
  • /p:VisualStudioVersion=11.0 - csproj文件中的相同错误*` - 已经存在,同样的错误

.csproj文件已<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>在我的解决方案中的每个csproj文件中指定,并且ToolsVersion="4.0".

我也尝试将更TargetFrameworkVersion改为4.0,这也不起作用.

我发现了一些笔记网上关于微软改变标志OnlyReferenceAndBuildProjectsEnabledInSolutionConfigurationfalsetrue4.0至4.5升级过程中,但是手动设置该标志中的csproj文件还没有解决的问题.

<OnlyReferenceAndBuildProjectsEnabledInSolutionConfiguration>
    false
</OnlyReferenceAndBuildProjectsEnabledInSolutionConfiguration>
Run Code Online (Sandbox Code Playgroud)

为什么msbuild在从4.0升级到4.5后无法找到这些子程序集,我该如何解决?

更新

我终于找到了问题的根源,但我不知道这是怎么回事.

ProjectA有一个类,它继承自ProjectB中的抽象类,其中一个属性ProejctB.BaseClass是类型System.Drawing.Image.

namespace ProjectA
{
    public class SomeClass : BaseClass { }
}

namespace ProjectB
{
    public abstract class BaseClass
    {
        public System.Drawing.Image GetImage() { };
    }
}
Run Code Online (Sandbox Code Playgroud)

从我在网上阅读的所有内容,以及创建自己的测试项目,这意味着ProjectA需要引用System.Drawing.Image才能构建.

但无论出于何种原因,当使用msbuild 4.0或VS 2010进行构建时,这种限制对于我们的项目似乎并不重要.非常高兴在没有引用的情况下构建ProjectA System.Drawing.Image.

即使在更新到.Net 4.5之后,我仍然可以ProjectA在不添加引用的情况下从Visual Studio 2010成功构建System.Drawing.Image,但是现在使用msbuild构建(正确吗?)失败.在VS 2012 Express中构建时,我也得到了参考错误,因此无论是什么允许这种情况发生,显然已经在较新版本的VS中得到修复.

现在,我已经完成了我们解决方案中的所有148个项目并修复了所有引用,但是我想打开这个问题,试着找到为什么我能够ProjectA使用msbuild 4.0或Visual Studio 2010 构建而没有引用的答案到System.Drawing.Image.

我已经确定我不能轻易地重现测试项目中的行为,所以我最好的猜测是它的一些配置,构建脚本的某些部分,或者它是.sln或.csproj文件时存在的错误已创建,并且不再存在新创建的项目.

Rac*_*hel 1

根据Hans 的评论,听起来版本 4 和版本 5 之间的内部 C# 编译器发生了一些变化,以修复允许我们在ProjectA没有正确引用的情况下构建的错误。

这与 MSBuild 没有任何关系,改变的是您使用了不同的 C# 编译器。版本 5 而不是 4。我在其他问题中看到了粗略的证据,这些证据更积极地想要解决间接类型引用。没有什么是固定不变的,每个人都可以用显而易见的解决方案来解决这个问题。

查看msbuild.exe日志时,我可以看到它归结为对 的调用csc.exe,其中包含完全相同的/reference列表,但在 4.5 中失败。

使用 4.0 构建 ProjectA

任务“Csc”
  c:\Windows\Microsoft.NET\Framework\v4.0.30319\Csc.exe /noconfig /nowarn:1701,1702 /nostdlib+ /errorreport:prompt /warn:4 /define:TRACE /reference:C:\Path\bin\ Release\ProjectB.dll /reference:C:\Windows\Microsoft.NET\Framework\v2.0.50727\mscorlib.dll /reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\v3.5\ System.Core.dll" /reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\v3.5\System.Data.DataSetExtensions.dll" /reference:C:\Windows\Microsoft.NET\ Framework\v2.0.50727\System.Data.dll /reference:C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.dll /reference:C:\Windows\Microsoft.NET\Framework\v2.0.50727\ System.Web.Services.dll /reference:C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Xml.dll /reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\ v3.5\System.Xml.Linq.dll" /debug:pdbonly /filealign:512 /keyfile:ProjectA.snk /optimize+ /out:obj\Release\ProjectA.dll /target:library Properties\AssemblyInfo.cs SomeFile.cs属性\VersionInfo.cs
  Microsoft (R) Visual C# 2010 编译器版本 4.0.30319.1
  版权所有 (C) 微软公司。版权所有。

完成执行任务“Csc”。

使用 4.5 构建 ProjectA

任务“Csc”(任务 ID:5812)
  C:\Windows\Microsoft.NET\Framework\v4.0.30319\Csc.exe /noconfig /nowarn:1701,1702 /nostdlib+ /errorreport:prompt /warn:4 /define:TRACE /highentropyva- /reference:C:\Path \bin\Release\ProjectB.dll /reference:C:\Windows\Microsoft.NET\Framework\v2.0.50727\mscorlib.dll /reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\v3 .5\System.Core.dll" /reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\v3.5\System.Data.DataSetExtensions.dll" /reference:C:\Windows\Microsoft .NET\Framework\v2.0.50727\System.Data.dll /引用:C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.dll /引用:C:\Windows\Microsoft.NET\Framework\v2 .0.50727\System.Web.Services.dll /reference:C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Xml.dll /reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft \Framework\v3.5\System.Xml.Linq.dll" /debug:pdbonly /filealign:512 /keyfile:ProjectA.snk /optimize+ /out:obj\Release\ProjectA.dll /target:library /utf8output Properties\AssemblyInfo .cs SomeFile.cs 属性\VersionInfo.cs(任务 ID:5812)
  Microsoft (R) Visual C# 编译器版本 4.0.30319.18408(任务 ID:5812)
   (任务ID:5812)
  适用于 Microsoft (R) .NET Framework 4.5(任务 ID:5812)
  版权所有 (C) 微软公司。版权所有。(任务ID:5812)
   (任务ID:5812)
SomeFile.cs(32,18):错误CS0012:类型“System.Drawing.Image”是在未引用的程序集中定义的。您必须添加对程序集“System.Drawing,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a”的引用。[C:\路径\ProjectA.csproj]
  c:\Path\bin\Release\ProjectB.dll:(与先前错误相关的符号的位置)(TaskId:5812)
  命令退出,代码为 1。(任务 ID:5812)
完成执行任务“Csc”——失败。(任务ID:5812)

我希望这里有人能够解释那是什么,以及如何用 4.0 重现这个“bug”,但是这个问题看起来并不容易回答。