我已经从ASP升级.NET MVC Beta版到1.0版,并对MVC项目进行了以下更改(如RC发行说明中所述):

<Project ...>
  ...
  <MvcBuildViews>true</MvcBuildViews>
  ...
  <Target Name="AfterBuild" Condition="'$(MvcBuildViews)'=='true'">
    <AspNetCompiler VirtualPath="temp" PhysicalPath="$(ProjectDir)\..\$(ProjectName)" />
  </Target>
  ...
</Project>

虽然构建在我们的本地开发环境上运行良好,但在TFS 2008构建下会失败,并显示"无法加载类型‘xxx.MvcApplication’",请参阅下面的构建日志(log):

...
using "AspNetCompiler" task from assembly "Microsoft.Build.Tasks.v3.5, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a".
Task "AspNetCompiler"

  Command:
  C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_compiler.exe -v temp -p D:\Builds\xxx\Continuous\TeamBuild\Sources\UI\xxx.UI.Dashboard\\..\xxx.UI.Dashboard 
  The "AspNetCompiler" task is using "aspnet_compiler.exe" from "C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_compiler.exe".
  Utility to precompile an ASP.NET application
  Copyright (C) Microsoft Corporation. All rights reserved.

/temp/global.asax(1): error ASPPARSE: Could not load type 'xxx.UI.Dashboard.MvcApplication'.
  The command exited with code 1.

Done executing task "AspNetCompiler" -- FAILED.
...

MVC 1.0安装在TFS上,解决方案在同一TFS服务器上的Visual Studio实例中构建时会编译.

如何解决此TFS生成问题?

推荐答案

问题源于以下事实:在ASP的后构建目标中使用了AspNetCompiler MSBuild任务.NET MVC项目希望引用Web项目bin文件夹中的dll.

在桌面构建中,bin文件夹位于源代码树下的预期位置.

但是,TFS Teambuild会将源文件的输出编译到构建服务器上的另一个目录.当AspNetCompiler任务启动时,它找不到引用所需DLL的bin目录,您会得到异常.

解决方案是将MVC项目的AfterBuild目标修改如下:

  <Target Name="AfterBuild" Condition="'$(MvcBuildViews)'=='true'">
    <AspNetCompiler Condition="'$(IsDesktopBuild)' != 'false'" VirtualPath="temp" PhysicalPath="$(ProjectDir)\..\$(ProjectName)" />
    <AspNetCompiler Condition="'$(IsDesktopBuild)' == 'false'" VirtualPath="temp" PhysicalPath="$(PublishDir)\_PublishedWebsites\$(ProjectName)" />
  </Target>

此更改使您可以在桌面和TFS构建服务器上编译视图.

Asp.net相关问答推荐

ASP.NET Core 延迟加载始终返回 null

属性包含破折号的 ServiceStack 请求对象?

我可以在一个 Web 项目中有多个 web.config 文件吗?

无法读取配置部分system.servicemodel,因为它缺少部分声明

在视图 Mvc.net 中访问路由值

如何在 ASP.Net Core Razor 页面上重定向

是否应该将 project.lock.json 文件签入源代码管理? (ASP.NET 核心 1.0)

将数据表导出到 Excel 文件

使用 Moq 验证活动注册

在 ASP.NET 中实现 404 的最佳方法

如何在 ASP.NET 站点中添加 favicon.ico

这个rendersection的代码是什么意思?

在 JavaScript 中获取当前会话值?

如何将 LINQ 左外连接限制为一行

如何保护存储在 web.config 中的密码?

捕获的异常本身为 null !

Application_Start 和 Application_OnStart 之间的区别

重新生成designer.cs

使用 FormsAuthentication.SetAuthCookie 存储更多信息

MVC4 中 Global.asax.cs 页面中的问题