2013-04-26 22 views
0

我在Visual Studio 2008的ASP.NET 3.5 Web应用程序项目中对用户控件(.ascx文件)进行了一些更改。我注意到我在标记中所做的更改未反映在设计器文件中(相当于well-knownproblem)。我尝试删除设计器文件并使用“转换为Web应用程序”重新生成它。在这样做时,我得到这个错误:将自定义ExpressionBuilder标记添加到.ascx时出现“设计器文件生成失败”

Generation of designer file failed: Could not load type 'MyWebApplication.MyCustomExpressionBuilder' from assembly 'System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'. (E:\MyPath\MyWebApplication\Web.config line 166)

我在的.ascx标记作出改变是使用一个custom ExpressionBuilder作为我的.ascx内的Visible和/或Enabled某些控件的属性的值。此特定的ExpressionBuilder已成功用于Web应用程序中的其他位置,以将布尔值返回到相似的属性。例如:

<asp:TableRow runat="server" Visible="<%$ MyCustom: TheExpressionValue %>"> 
    <%-- some TableCells and contents here --%> 
</asp:TableRow> 

在Web.config线错误消息指出是add标签如下所示:

<system.web> 
    <compilation debug="true"> 
     <!-- Skipping the 'assemblies' and 'buildProviders' areas --> 
     <expressionBuilders> 
      <add expressionPrefix="MyCustom" type="MyWebApplication.MyCustomExpressionBuilder" /> 
     </expressionBuilders> 
    </compilation> 
    <!-- other stuff --> 
</system.web> 

MyCustomExpressionBuilder是在同一个Web应用程序项目在一个名为Code目录(不是App_Code,无论出于何种原因,我不知道如果我移动类文件,会损失多少)。

我可以解决此问题,如果必须避免控件中的自定义ExpressionBuilder并添加调用页面的一些属性来代替使用,但这不会很理想。请注意,内置表达式(如<%$ Resources: CommonResource, SomeTextString %>)已经在控制中并且工作正常。

这里有一些事情我已经尝试:

  1. 刚刚重建项目。设计器文件无法加载,并且由于缺少属性,导致代码隐藏中出现很多构建错误。
  2. 只需更改控件标记,保存并更改控件(在尝试删除设计器文件之前),确保没有打开设计器文件。这个过程默默地失败了。
  3. ClassName参数添加到我的<%@ Control %>指令中,如建议here。没有效果。
  4. 添加<%@ Assembly Name="MyWebApplication" %>。没有效果。
  5. 添加<%@ Import Namepace="MyWebApplication" %>。没有效果。加入<%@ Reference VirtualPath="~/Code/MyCustomExpressionBuilder.cs" %>。没有效果。
  6. 关闭并重新启动Visual Studio。在第一次尝试在ascx上运行“转换为Web应用程序”时,至少我得到了一个不同的错误:“抛出了'System.Exception'类型的异常。”尝试重建项目并获取所有错误(参见上面的#1)后,“转换为Web应用程序”会产生与以前一样的“生成设计器文件失败”错误消息。

将项目升级到新的Visual Studio版本目前不是一个选项。如前所述,我不想移动自定义的ExpressionBuilder类,因为它至少从.aspx文件开始工作。我还能尝试什么?

回答

0

我想通了。问题在于,出于某种原因,编译器无法找到具有自定义ExpressionBuilder的程序集。什么固定的问题是使用一个Partial Assembly Reference略有更多信息不仅仅是类名和命名空间在add标签:

<system.web> 
<compilation debug="true"> 
    <!-- Skipping the 'assemblies' and 'buildProviders' areas --> 
    <expressionBuilders> 
     <add expressionPrefix="MyCustom" type="MyWebApplication.MyCustomExpressionBuilder, MyWebApplication" /> 
    </expressionBuilders> 
</compilation> 
<!-- other stuff --> 

换句话说,改变type属性同时指定类名(带名称空间)和程序集的名称。请注意,指定更多附加信息会导致不同的错误(即使是版本号,即使版本号正确)。

至于我怎么知道的,解决这些问题的一个好建议是按照here的描述启用日志记录。对于VS2008,你可以使用regedit到:

  1. 转到HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\9.0
  2. 创建一个名为WebApplicationProjects如果不存在新的密钥。然后,选择它。
  3. 如果不存在,请创建一个名为Debug的新密钥。然后,选择它。
  4. 添加一个名为LogFile的新字符串。该值应该是VS2008具有写入权限的路径(因此,可能不是C的根目录中的文件:)。请务必转义任何反斜杠,例如C:\\PathICanWrite\\vslogfile.txt
  5. 添加一个名为Enabled新的DWORD,并将其设置为1。
  6. 添加一个名为LogFieldGeneratorFailures新的DWORD,并将其设置为1。
  7. 重启VS2008。

当我查看日志文件时,我能够使用堆栈跟踪来确定是否有装配加载问题,现在看起来很明显。在日志中的消息给出了更前端解决的组件负载问题:

WRN: Assembly binding logging is turned OFF.
To enable assembly bind failure logging, set the registry value [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD) to 1.
Note: There is some performance penalty associated with assembly bind failure logging.
To turn this feature off, remove the registry value [HKLM\Software\Microsoft\Fusion!EnableLog].

我发现,我需要重新启动机器新的注册表设置生效。然后,日志中提供了其他程序集绑定信息。

相关问题