首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在向ExpressionBuilder添加自定义.ascx标记时“生成设计器文件失败”

在向ExpressionBuilder添加自定义.ascx标记时“生成设计器文件失败”
EN

Stack Overflow用户
提问于 2013-04-26 17:12:48
回答 1查看 838关注 0票数 0

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

生成设计器文件失败:无法从程序集“System.Web、Version=2.0.0.0、Culture=neutral、PublicKeyToken=b03f5f7f7f11d50a3a”加载类型“System.Web”。(E:\MyPath\MyWebApplication\Web.config第166行)

我在.ascx标记中所做的更改是使用ExpressionBuilder作为ExpressionBuilder中某些控件的Visible和/或Enabled属性的值。这个特定的ExpressionBuilder成功地在web应用程序的其他地方使用,以将布尔值返回到类似的属性。例如:

代码语言:javascript
复制
<asp:TableRow runat="server" Visible="<%$ MyCustom: TheExpressionValue %>">
    <%-- some TableCells and contents here --%>
</asp:TableRow>

错误消息中注意到的Web.config行是以下中的add标记:

代码语言:javascript
复制
<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,并添加一些属性供调用页使用,我可以解决这个问题,但这并不理想。注意,内置表达式(如<%$ Resources: CommonResource, SomeTextString %>)已经在控件中,并且运行良好。

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

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

当前不可以将项目升级到新的Visual版本。如前所述,我倾向于不移动自定义ExpressionBuilder类,因为它至少是从.aspx文件中运行的。我还能做什么呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-27 04:25:10

我想通了。问题是,由于某种原因,编译器无法找到具有自定义ExpressionBuilder的程序集。解决这个问题的方法是使用一个部分装配参考,它包含的信息比add标记中的类名和名称空间稍微多一点:

代码语言:javascript
复制
<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. 添加一个名为Enabled的新DWORD,并将其设置为1。
  6. 添加一个名为LogFieldGeneratorFailures的新DWORD,并将其设置为1。
  7. 重新启动VS2008。

当我查看日志文件时,我能够使用堆栈跟踪来确定我有一个程序集加载问题,这一点现在看来是显而易见的。日志中的消息为解决程序集加载问题提供了进一步提示:

程序集绑定日志被关闭。 若要启用程序集绑定失败日志记录,请将注册表值HKLM\Software\Microsoft\Fusion!EnableLog设置为1。 注意:程序集绑定失败日志记录有一些性能损失。 若要关闭此功能,请删除注册表值HKLM\Software\Microsoft\聚变!EnableLog。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16241808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档