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,这也不起作用.
我发现了一些笔记网上关于微软改变标志OnlyReferenceAndBuildProjectsEnabledInSolutionConfiguration
从false
到true
4.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文件时存在的错误已创建,并且不再存在新创建的项目.
根据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”,但是这个问题看起来并不容易回答。
归档时间: |
|
查看次数: |
2245 次 |
最近记录: |