【发布时间】:2014-12-25 16:01:07
【问题描述】:
我们有一个 .Net 3.5 应用程序,它是使用一些调用 msbuild.exe 的脚本构建的
最近,作为全公司政策的一部分,我们所有的机器都开始自动从 .Net 4.0 更新到 .Net 4.5,而且我们的构建脚本开始失败。
给出的错误是他们找不到引用的程序集,如下所示:
错误 CS0012:“System.Drawing.Image”类型在未引用的程序集中定义。 您必须添加对程序集“System.Drawing,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a”的引用。看起来在每种情况下,我们都尝试构建项目 A 引用项目 B,项目 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 文件已经在我的解决方案中的每个 csproj 文件中指定了 <TargetFrameworkVersion>v3.5</TargetFrameworkVersion> 和 ToolsVersion="4.0"。
我也试过把TargetFrameworkVersion改成4.0,也不管用。
我在网上找到了一些关于 Microsoft 在 4.0 到 4.5 更新期间将标志 OnlyReferenceAndBuildProjectsEnabledInSolutionConfiguration 从 false 更改为 true 的说明,但是在 csproj 文件中手动设置该标志也不能解决问题。
<OnlyReferenceAndBuildProjectsEnabledInSolutionConfiguration>
false
</OnlyReferenceAndBuildProjectsEnabledInSolutionConfiguration>
为什么从 4.0 升级到 4.5 后 msbuild 找不到这些子程序集,我该如何解决?
更新
我终于找到了问题的根源,但我不知道这是怎么发生的。
ProjectA 有一个类继承自 ProjectB 中的抽象类,ProejctB.BaseClass 的属性之一是 System.Drawing.Image 类型。
namespace ProjectA
{
public class SomeClass : BaseClass { }
}
namespace ProjectB
{
public abstract class BaseClass
{
public System.Drawing.Image GetImage() { };
}
}
根据我在网上阅读的所有内容以及创建自己的测试项目,这意味着 ProjectA 需要引用 System.Drawing.Image 才能构建。
但无论出于何种原因,在使用 msbuild 4.0 或在 VS 2010 中构建项目时,此限制似乎对我们的项目无关紧要。构建 ProjectA 而不引用 System.Drawing.Image 非常高兴。
即使在更新到 .Net 4.5 之后,我仍然可以从 Visual Studio 2010 成功构建 ProjectA,而无需添加对 System.Drawing.Image 的引用,但是现在使用 msbuild 构建(正确吗?)失败。在 VS 2012 Express 中构建时,我也遇到了参考错误,因此在新版本的 VS 中显然已经修复了允许这种情况发生的任何问题。
目前,我已经浏览了我们解决方案中的所有 148 个项目并修复了所有引用,但是我想保留这个问题以尝试回答为什么我能够使用 msbuild 4.0 构建 ProjectA 或Visual Studio 2010 没有引用System.Drawing.Image。
我已经确定我不能轻易地在测试项目中重现该行为,所以我最好的猜测是它的某些配置、构建脚本的某些部分,或者它是 .sln 或.csproj 文件已创建,并且在新创建的项目中不再存在。
【问题讨论】:
-
从 MS PSS 开发人员的角度来看,您需要获得一个能够重现该问题的简单示例。当您这样做时,您可能会自己看到增量。如果您仍然没有在基本解决方案中看到根本原因,那么请记录支持案例,因为这有一种错误的味道(如果是,故障排除将得到免费支持)。一个提示是,如果它在 VS2010 中编译并在 2012 年失败,请检查“模块”窗口中加载了哪些版本的 DLL……祝你好运!
-
@JeremyThompson 我一直试图在一个小样本解决方案中重现该问题,但到目前为止还没有运气。该应用程序非常大,几年前,是在我加入团队之前创建的。此外,创建它的原始人不再在我身边问他是否对设置做了任何不寻常的事情。我相信你是对的,它很可能是一个错误,但是也会仔细检查 dll 版本。谢谢。
-
您是否尝试过阅读 VS2010 构建日志以查看它传递给 MSBuild 的开关以使其编译正常?
-
这与 MSBuild 没有任何关系,改变的是您使用的是不同的 C# 编译器。版本 5 而不是 4。我在其他问题中看到了粗略的证据,这些证据更积极地想要解决间接类型引用。没有什么可钉在墙上的,每个人都只是用明显的解决方案来解决这个问题。挂断这个是愚蠢的,只需添加参考。
-
@HansPassant 我同意,最好只是解决问题。我只是好奇是什么(错误?)首先允许它构建。不过,我很确定您对 C# 编译器的更改是正确的。谢谢。
标签: c# msbuild .net-3.5 .net-4.5 csc