我们有一个使用一些脚本调用
最近,由于公司范围内的政策,所有计算机都开始自动更新到.Net 4.5,导致我们的构建脚本失败了。
错误信息是它们找不到引用的程序集,就像这样:
error CS0012:类型“System.Drawing.Image”在未引用的程序集中定义。您必须添加对程序集“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文件中已经指定了
我还尝试将
我在网上找到了一些关于Microsoft在4.0到4.5更新期间将标志
从4.0升级到4.5后,为什么msbuild无法找到这些子程序集,我该如何解决?
更新
我终于找出问题的根源了,但我不知道为什么会发生这种情况。
ProjectA有一个类继承自ProjectB中的抽象类,而ProjectB.BaseClass的其中一个属性是System.Drawing.Image类型。
从我在网上阅读的所有内容,以及创建自己的测试项目来看,这意味着ProjectA需要引用才能构建。
但是出于某种原因,在使用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或Visual Studio 2010构建ProjectA而无需参考System.Drawing.Image的答案。
我已经确定我不能轻松地在测试项目中重现该行为,因此我最好的猜测是其配置、构建脚本的某些部分,或者这是一个存在于创建.sln或.csproj文件时的错误,而在新创建的项目中不再存在。
msbuild.exe
来构建的.Net 3.5应用程序。最近,由于公司范围内的政策,所有计算机都开始自动更新到.Net 4.5,导致我们的构建脚本失败了。
错误信息是它们找不到引用的程序集,就像这样:
error CS0012:类型“System.Drawing.Image”在未引用的程序集中定义。您必须添加对程序集“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>
,并且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中的抽象类,而ProjectB.BaseClass的其中一个属性是System.Drawing.Image类型。
namespace ProjectA
{
public class SomeClass : BaseClass { }
}
namespace ProjectB
{
public abstract class BaseClass
{
public System.Drawing.Image GetImage() { };
}
}
从我在网上阅读的所有内容,以及创建自己的测试项目来看,这意味着ProjectA需要引用才能构建。
但是出于某种原因,在使用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或Visual Studio 2010构建ProjectA而无需参考System.Drawing.Image的答案。
我已经确定我不能轻松地在测试项目中重现该行为,因此我最好的猜测是其配置、构建脚本的某些部分,或者这是一个存在于创建.sln或.csproj文件时的错误,而在新创建的项目中不再存在。
msbuild.exe
脚本是相同的,但是生成的csc.exe
有一个区别-一个/highentropyva-标志。它似乎不相关,并且无论我将标志设置为什么或是否包含它,手动运行它时构建仍然失败。生成的csc.exe
引用相同,并且不包括对System.Drawing
的引用。 - Rachel