MSBuild找不到已通过web.config进行bindingRedirect'd的DLL

时间:2013-07-25 16:24:53

标签: msbuild azure-web-sites assembly-resolution razorgenerator

我有一个ASP.NET MVC 4 Web应用程序。我正在使用RazorGenerator.MsBuild构建目标来预编译我的Razor * .cshtml文件。当我在本地构建我的项目时,一切都很顺利。

当我将项目部署到Azure网站时,我收到此错误:

  

“C:\ DWASFiles \网站\我的站点名称\ VirtualDirectory0 \网站\库\ MyWebProject \ MyWebProject.csproj”   (构建; pipelinePreDeployCopyAllFilesToOneFolder目标)(1) - >   (PrecompileRazorFiles目标) - >
  C:\ DWASFiles \网站\我的站点名称\ VirtualDirectory0 \网站\库\包\ RazorGenerator.MsBuild.2.0.1 \ TOOLS \ RazorGenerator.targets(21.9):   错误:创建配置节处理程序时发生错误   for system.web.webPages.razor / pages:无法加载文件或程序集   'System.Web.WebPages.Razor,Version = 2.0.0.0,Culture = neutral,   PublicKeyToken = 31bf3856ad364e35'或其依赖项之一。该   系统找不到指定的文件。   (C:\ DWASFiles \网站\我的站点名称\ VirtualDirectory0 \网站\库\ MyWebProject \ MyWebProject \意见\的web.config   第7行)   [C:\ DWASFiles \网站\我的现场名\ VirtualDirectory0 \站点\库\服务器\ MyWebProject \ MyWebProject \ MyWebProject.csproj]

基本上说它找不到System.Web.WebPages.Razor的版本2.0.0.0

消息指向我的Views \ web.config的第7行,它是configSection.sectionGroup部分中的标准MVC 4行:

<section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />

通过在我的本地计算机上运行Process Monitor,我可以看到它首先执行加载图像

  

C:\ Program Files(x86)\ Microsoft ASP.NET \ ASP.NET网页\ v1.0 \ Assemblies \ System.Web.WebPages.Razor.dll

然后在

上执行另一个加载图像
  

C:\ MyWebProject \包\ Microsoft.AspNet.WebPages.2.0.30506.0 \ lib中\ net40 \ System.Web.WebPages.Razor.dll

上的另一个加载图像
  

C:\ MyWebProject \包\ RazorGenerator.MsBuild.2.0.1 \工具\ V2 \ System.Web.WebPages.Razor.dll

然后最后另一个加载图片

  

C:\的Windows \ Microsoft.NET \组件\ GAC_MSIL \ System.Web.WebPages.Razor \ v4.0_2.0.0.0__31bf3856ad364e35 \ System.Web.WebPages.Razor.dll

来自GAC的

我怀疑它在我的计算机而不是Azure网站上运行,因为System.Web.WebPages.Razor的2.0.0.0版本不在Azure网站的GAC中,但版本1.0.0.0就在那里。

在我的主web.config文件中,我在runtime.assemblyBinding部分中有这些行:

<dependentAssembly>
    <assemblyIdentity name="System.Web.WebPages.Razor" publicKeyToken="31bf3856ad364e35" />
    <bindingRedirect oldVersion="0.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
</dependentAssembly>

通过查看Process Monitor,看起来MSBuild正在读取我的web.config文件,但在构建我的Web程序集时没有读取任何其他.config文件(之前它是“C:\ Windows \ Microsoft.NET \ Framework \ v4” .0.30319 \ msbuild.exe.config“)。因此,我看不到任何其他可以放置这些程序集重定向的地方。

有什么好奇的是,如果我通过设置

禁用RazorGenerator,该项目将在Azure网站上完美部署
<PrecompileRazorFiles>true</PrecompileRazorFiles>

<PrecompileRazorFiles>false</PrecompileRazorFiles>

显然,Razor Generator传递不会发生此禁用,因此结果中没有预编译视图。但是,它仍然运行良好。

因此,这似乎只会影响RazorGenerator“PrecompileRazorFiles”构建目标,并且仅在Azure网站上部署。

如何确保所有构建目标(包括RazorGenerator)始终使用正确的DLL?

对于如何调试这一点的任何其他建议也将非常感激。

1 个答案:

答案 0 :(得分:0)

这可能是RazorGenerator特有的问题。该工具的一位作者对此进行了调查,并且能够提出a workaround that fixed this issue