Car*_*ond 5 msbuild .net-4.0 .net-4.5
我们遇到了看似常见的错误
Could not load type 'System.Runtime.CompilerServices.ExtensionAttribute' from assembly 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
Run Code Online (Sandbox Code Playgroud)
在一个需要针对.Net 4.0进行编译的项目中,它是在运行Windows Server 2012的构建服务器(带.Net 4.5)上构建的.该项目是一个Web应用程序,可部署到运行2003的Web服务器,其中安装.Net 4.5不是一个选项.在那里它运行"经典".Net 4.0
从类似的问题,我们正在尝试MSBuild的命令行选项:
/property:FrameworkPathOverride="C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0"
Run Code Online (Sandbox Code Playgroud)
我们也尝试了各种组合
/property:ReferencePath="C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0"
/property:NoStdLib=true
/property:NoCompilerStandardLib=true
Run Code Online (Sandbox Code Playgroud)
实际上,引用程序集(包括.dll文件)安装在构建服务器上的那个位置.但是当我们部署网站并访问主页时,我们会收到该错误.(有趣的是,在页面重新加载时,错误消失,并且站点正常运行.)针对.Net 4.0程序集编译所需的MSBuild参数是什么?
更新 我打开MSBuild上的荒谬级别日志记录,我看到它显然是针对.Net 4.0参考程序集构建的:
Resolved file path is "C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\mscorlib.dll
Run Code Online (Sandbox Code Playgroud)
我没有看到任何提及该文件夹或构建服务器的工作目录之外的程序集.因此它似乎可以正确编译,但是当部署在Web服务器上时,它会抛出异常.
至于在页面重新加载时异常消失,我想知道这是否与标记预编译步骤有关.我们在构建服务器上运行aspnet_compile.也许如果生成的程序集有异常,Web服务器将重新编译它.重新编译的程序集很好,因为它是用真正的.Net 4.0创建的.
好吧,答案结果是令人尴尬的。在我们从详细的 MSBuild 输出中确认它实际上是根据正确的参考程序集构建网站项目后,我们意识到该项目中有几个针对 .Net 4.5 构建的内部 NuGet 包。其中之一充满了扩展方法,这就是导致异常的原因。针对 .Net 4.0 重建它们解决了问题。
这就提出了一个有趣的问题。如果针对 4.0 编译第 3 方 NuGet 包但使用 4.5 引用,我们将处于相同的情况,但无法修复它。因此,包发布者的教训是确保您的 4.0 版本是根据参考程序集进行编译的。
归档时间: |
|
查看次数: |
2052 次 |
最近记录: |