0

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

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

我在 .ascx 标记中所做的更改是使用自定义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 %>指令中。没有效果。
  4. 添加<%@ Assembly Name="MyWebApplication" %>. 没有效果。
  5. 添加<%@ Import Namepace="MyWebApplication" %>. 没有效果。
  6. 添加<%@ Reference VirtualPath="~/Code/MyCustomExpressionBuilder.cs" %>. 没有效果。
  7. 关闭并重新启动 Visual Studio。第一次尝试在 ascx 上运行“转换为 Web 应用程序”时,至少我得到了一个不同的错误:“抛出了 'System.Exception' 类型的异常。” 在尝试重建项目并得到所有错误后(参见上面的#1),“转换为 Web 应用程序”会产生与以前相同的“生成设计器文件失败”错误消息。

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

4

1 回答 1

0

我想到了。问题是,由于某种原因,编译器找不到带有 custom 的程序集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 -->

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

至于我是如何发现的,解决这些问题的一个好技巧是启用此处描述的日志记录。对于 VS2008,您将使用regedit

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

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

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

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

于 2013-04-27T04:25:10.113 回答