Visual studio 2008 &引用;生成设计器文件失败";将自定义ExpressionBuilder标记添加到.ascx时

Visual studio 2008 &引用;生成设计器文件失败";将自定义ExpressionBuilder标记添加到.ascx时,visual-studio-2008,asp.net-3.5,ascx,expressionbuilder,Visual Studio 2008,Asp.net 3.5,Ascx,Expressionbuilder,我正在Visual Studio 2008中对ASP.NET 3.5 web应用程序项目中的用户控件(.ascx文件)进行一些更改。我注意到,我在标记中所做的更改并没有反映在设计器文件中(一个很好的示例)。我尝试删除设计器文件并使用“转换为Web应用程序”重新生成它。执行此操作时,出现以下错误: 生成设计器文件失败:无法加载类型 来自程序集的“MyWebApplication.MyCustomExpressionBuilder” 'System.Web,版本=2.0.0.0,区域性=中性, Pu

我正在Visual Studio 2008中对ASP.NET 3.5 web应用程序项目中的用户控件(.ascx文件)进行一些更改。我注意到,我在标记中所做的更改并没有反映在设计器文件中(一个很好的示例)。我尝试删除设计器文件并使用“转换为Web应用程序”重新生成它。执行此操作时,出现以下错误:

生成设计器文件失败:无法加载类型 来自程序集的“MyWebApplication.MyCustomExpressionBuilder” 'System.Web,版本=2.0.0.0,区域性=中性, PublicKeyToken=b03f5f7f11d50a3a'。 (E:\MyPath\MyWebApplication\Web.config第166行)

我在.ascx标记中所做的更改是使用a作为.ascx中某些控件的
可见
和/或
启用
属性的值。此特定的
ExpressionBuilder
在web应用程序的其他位置成功地用于将布尔值返回到类似的属性。例如:

<asp:TableRow runat="server" Visible="<%$ MyCustom: TheExpressionValue %>">
    <%-- some TableCells and contents here --%>
</asp:TableRow>
MyCustomExpressionBuilder
位于名为
code
的目录中的同一web应用程序项目中(不是
App\u code
,无论出于何种原因,我不确定如果移动类文件,会有多少损坏)

如果必须的话,我可以通过避免控件中的自定义
ExpressionBuilder
,并添加一些属性供调用页面使用来解决这个问题,但这并不理想。请注意,内置表达式(如
)已经在控件中,并且工作正常

以下是我尝试过的一些事情:

  • 只是重建项目。设计器文件没有加载,并且由于缺少属性,代码中出现了很多构建错误
  • 只需更改控件标记、保存并更改控件(在尝试删除设计器文件之前),确保没有打开设计器文件。这个过程只是默默地失败了
  • 按照建议,将
    ClassName
    参数添加到我的
    指令中。没有效果
  • 添加
    。没有效果
  • 添加
    。没有效果
  • 添加
    。没有效果
  • 关闭并重新启动Visual Studio。在第一次尝试在ascx上运行“Convert to Web Application”时,至少我遇到了一个不同的错误:“抛出了类型为'System.Exception'的异常。”在尝试重新生成项目并获得所有错误(请参见上文#1)后,“Convert to Web Application”会产生相同的“生成设计器文件失败”错误消息与以前一样

  • 当前不允许将项目升级到新的Visual Studio版本。如前所述,我不希望移动自定义
    ExpressionBuilder
    类,因为它至少在.aspx文件中工作。我还能试什么呢?

    我想出来了。问题是,由于某种原因,编译器无法找到带有自定义
    ExpressionBuilder
    的程序集。解决此问题的方法是在
    add
    标记中使用比类名和名称空间稍多的信息:

    <system.web>
    <compilation debug="true">
        <!-- Skipping the 'assemblies' and 'buildProviders' areas -->
        <expressionBuilders>
            <add expressionPrefix="MyCustom" type="MyWebApplication.MyCustomExpressionBuilder, MyWebApplication" />
        </expressionBuilders>
    </compilation>
    <!-- other stuff -->
    
    
    .  对于VS2008,您可以使用
    regedit
    来:

  • 转到
    HKEY\U CURRENT\U USER\Software\Microsoft\VisualStudio\9.0
  • 创建名为
    WebApplicationProjects
    的新键(如果不存在)。然后,选择它
  • 如果不存在名为
    Debug
    的新密钥,请创建该密钥。然后,选择它
  • 添加名为
    LogFile
    的新字符串。该值应该是VS2008将具有写入权限的路径(因此,可能不是C:根目录中的文件)。确保避开任何反斜杠,如
    C:\\PathICanWrite\\vslogfile.txt
  • 添加名为启用的新DWORD,并将其设置为1
  • 添加名为
    LogFieldGeneratorFailures
    的新DWORD,并将其设置为1
  • 重新启动VS2008
  • 当我查看日志文件时,我能够使用堆栈跟踪来确定我有一个程序集加载问题,这一点现在看起来很明显。日志中的消息提供了解决程序集加载问题的进一步提示:

    警告:程序集绑定日志记录已关闭。
    要启用程序集绑定失败日志记录,请将注册表值[HKLM\Software\Microsoft\Fusion!EnableLog](DWORD)设置为1。
    注意:程序集绑定失败日志记录会带来一些性能损失。
    要关闭此功能,请删除注册表值[HKLM\Software\Microsoft\Fusion!EnableLog]

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

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