我正在对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应用程序的其他地方使用,以将布尔值返回到类似的属性。例如:
<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,并添加一些属性供调用页使用,我可以解决这个问题,但这并不理想。注意,内置表达式(如<%$ Resources: CommonResource, SomeTextString %>)已经在控件中,并且运行良好。
以下是我尝试过的一些事情:
ClassName参数添加到我的<%@ Control %>指令中,如建议的这里。没有效果。<%@ Assembly Name="MyWebApplication" %>。没有效果。<%@ Import Namepace="MyWebApplication" %>。没有效果。<%@ Reference VirtualPath="~/Code/MyCustomExpressionBuilder.cs" %>。没有效果。当前不可以将项目升级到新的Visual版本。如前所述,我倾向于不移动自定义ExpressionBuilder类,因为它至少是从.aspx文件中运行的。我还能做什么呢?
发布于 2013-04-27 04:25:10
我想通了。问题是,由于某种原因,编译器无法找到具有自定义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来:
HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\9.0WebApplicationProjects的新密钥。然后,选择它。Debug的新密钥。然后,选择它。LogFile的新字符串。该值应该是VS2008将具有写权限的路径(因此,在C:的根中可能不会有一个文件)。确保避免任何反斜杠,如C:\\PathICanWrite\\vslogfile.txt。Enabled的新DWORD,并将其设置为1。LogFieldGeneratorFailures的新DWORD,并将其设置为1。当我查看日志文件时,我能够使用堆栈跟踪来确定我有一个程序集加载问题,这一点现在看来是显而易见的。日志中的消息为解决程序集加载问题提供了进一步提示:
程序集绑定日志被关闭。 若要启用程序集绑定失败日志记录,请将注册表值HKLM\Software\Microsoft\Fusion!EnableLog设置为1。 注意:程序集绑定失败日志记录有一些性能损失。 若要关闭此功能,请删除注册表值HKLM\Software\Microsoft\聚变!EnableLog。
我发现需要重新启动机器才能使新的注册表设置生效。然后,日志中有其他程序集绑定信息。
https://stackoverflow.com/questions/16241808
复制相似问题