【问题标题】:"Generation of designer file failed" when adding custom ExpressionBuilder tags to .ascx将自定义 ExpressionBuilder 标记添加到 .ascx 时“生成设计器文件失败”
【发布时间】:2013-04-26 17:12:48
【问题描述】:

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

设计器文件生成失败:无法加载类型 程序集中的“MyWebApplication.MyCustomExpressionBuilder” 'System.Web,版本=2.0.0.0,文化=中性, PublicKeyToken=b03f5f7f11d50a3a'。 (E:\MyPath\MyWebApplication\Web.config 第 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 类位于名为Code 的目录中的同一个Web 应用程序项目中(不是App_Code,无论出于何种原因,我不确定如果我移动类文件会破坏多少)。

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

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

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

目前无法选择将项目升级到新的 Visual Studio 版本。如前所述,我不希望移动自定义 ExpressionBuilder 类,因为它至少可以从 .aspx 文件中工作。我还能尝试什么?

【问题讨论】:

    标签: visual-studio-2008 asp.net-3.5 ascx expressionbuilder


    【解决方案1】:

    我想通了。问题是,由于某种原因,编译器找不到带有自定义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。

    当我查看日志文件时,我能够使用堆栈跟踪来确定我遇到了程序集加载问题,这现在看起来很明显。日志中的一条消息提供了解决程序集负载问题的进一步提示:

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

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

    【讨论】:

      猜你喜欢
      • 2010-09-07
      • 1970-01-01
      • 2010-11-25
      • 2011-05-18
      • 2015-01-15
      • 1970-01-01
      • 2020-11-08
      • 2011-03-12
      • 1970-01-01
      相关资源
      最近更新 更多