在大型预编译的Asp.net网站项目中出现错误CS0433

时间:2013-02-09 02:38:00

标签: asp.net .net-4.0 msbuild visual-studio-2012

背景

我接手了一个非常大的asp.net网站项目。旧的部署过程是将.cs,.aspx和.ascx文件复制到IIS并使其动态构建。我想预编译它并使用TeamCity自动部署它。我已经完成了一些其他网站项目。

该项目有大约350个用户控件,这些控件在文件夹中组织得很好,但在整个地方都可以使用。从其他文件夹引用的控件,彼此...基本上是循环文件引用的噩梦。

我的尝试

我的第一次尝试是像其他人一样建立它。 MS建立整个vs2012解决方案。我遇到了大量“不允许循环文件引用”。来发现所有这些组织良好的控件在任何地方都使用,并且有循环引用到处都是。 I read this我将“web.config”切换为compilation batch="false",然后在构建中将网站设置为“不可更新”和“使用固定命名程序集”。该网站构建,但在我的四核,ssd,16gb ram开发框上编译需要25分钟。这是不可接受的构建时间。

我知道如果我关闭“使用固定命名程序集”,该网站的构建速度会明显加快。 (我已经在一个较小的网站上证明了这一点。它从4分钟到45秒)。当我删除该设置时,我得到了奇怪的构建错误:

c:\Projects\Web\Site.master(146): error CS0433: The type 'ASP.usercontrols_modules_viewprofilepopup_ascx' exists in both 'c:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\web\8d37b2c6\4c39f0a\App_Web_viewprofilepopup.ascx.4101713c.dll' and 'c:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\web\8d37b2c6\4c39f0a\App_Web_xa514so5.dll'

c:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\web\8d37b2c6\4c39f0a\App_Web_site.master.cdcab7d2.0.cs(927): error CS0433: The type 'ASP.usercontrols_modules_viewprofilepopup_ascx' exists in both 'c:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\web\8d37b2c6\4c39f0a\App_Web_viewprofilepopup.ascx.4101713c.dll' and 'c:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\web\8d37b2c6\4c39f0a\App_Web_xa514so5.dll'

error ASPPARSE: c:\Projects\web\Web\UserControls\Modules\JobsLeftMenu.ascx(128): error CS0433: The type 'ASP.usercontrols_modules_imagesgallerymodule_ascx' exists in both 'c:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\web\8d37b2c6\4c39f0a\App_Web_imagesgallerymodule.ascx.4101713c.dll' and 'c:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\web\8d37b2c6\4c39f0a\App_Web_nvrj33tx.dll'

error ASPPARSE: c:\Projects\web\Web\Site.master(146): error CS0433: The type 'ASP.usercontrols_modules_viewprofilepopup_ascx' exists in both 'c:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\web\8d37b2c6\4c39f0a\App_Web_viewprofilepopup.ascx.4101713c.dll' and 'c:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\web\8d37b2c6\4c39f0a\App_Web_xa514so5.dll'

这是确切的aspnet_compiler.exe命令:

  

aspnet_compiler.exe -v / web -p Web \ -f“预编译Web”

我用Google搜索答案。不,它们不会在任何地方的代码中重复。它们恰好位于不同的文件夹中,由不同文件夹中的其他控件使用。我有一种感觉这是由于循环文件引用的事情。好的。我删除了其中一些的用法,看看它是否会构建,构建过程就像这个一样转移到其他错误上。我不能只是删除所有代码以适应这个...如何在不打开“使用固定命名组件”的情况下修复这些错误?

我试过的事

  1. 在整个系统中清除了Temporary ASP.NET Files
  2. 从visual studio 2012中尝试了“发布”。同样的错误。
  3. 尝试将网站转换为Web应用程序,但错误太多(超过600+)。
  4. 再次:确保没有重复的文件和代码可以解释它。我使用notepad ++搜索整个解决方案文件夹,以验证没有其他具有相同名称的控件。
  5. Checked this.
  6. 我打开了msbuild性能调整:/m /p:CreateHardLinksForCopyLocalIfPossible=true /p:BuildInParallel=true
  7. 我很难过,似乎认为我唯一的选择是重写应用程序,在转换为Web应用程序时轻松解决错误,或者继续将源部署到Web服务器,但是会自动执行。

1 个答案:

答案 0 :(得分:7)

我知道你已经尝试过,但是避免使用循环引用将是你最好的选择。请注意,术语“循环引用”实际上并不完全正确。构建系统抱怨的是目录级别的循环引用,而不是文件级别。

e.g。 sub1\page.aspx使用sub2\uc1.ascx使用sub1\uc2.ascx

在文件级别,没有圆圈,但在目录级别存在,并且这与批处理的工作方式相混淆。

虽然看起来你有很多这样的情况让它无法修复,但我敢打赌,如果你看一下'目录圈'的细节,那就不是那么多了。绘制参考图可能有助于理解事物。

然后你只需要将违规者移到另一个文件夹中并相应地更改链接。

是的,这是一个痛苦的过程,但它很可能是可以解决的。