引用预编译的主页时无法加载类型“ ASP.XXX”
-
24-10-2019 - |
题
我正在尝试预编译一些主页(不可更新),以在多个应用程序中共享它们。我预先编译的项目是一个网站。引用预编码的项目是一个Web应用程序。但是,每次尝试从客户端引用主页时,我都会得到一个无法加载类型的'asp.xxx_master'。
<%@ Master Language="C#" Inherits="ASP.sitebase_master" %>
我的预编译主页看起来像这样。
<%@ Master Language="C#" ClientIDMode="Static" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org /TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="AspNetHead" runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<!--[if IE]><meta http-equiv="X-UA-Compatible" content="IE=7" /><![endif]-->
<asp:ContentPlaceHolder ID="MetaContent" runat="server" />
<title>Web Portal</title>
<link href="/media/css/style.css" rel="stylesheet" type="text/css" />
<link href="/media/js/plugins/colorbox/colorbox.css" rel="stylesheet" type="text/css" />
<asp:ContentPlaceHolder ID="StyleContent" runat="server" />
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js" type="text/javascript" language="javascript"></script>
<script src="/media/js/plugins/colorbox/jquery.colorbox-min.js" type="text/javascript" language="javascript"></script>
<script src="/media/js/plugins/filestyle/jquery.filestyle.min.js" type="text/javascript" language="javascript"></script>
<script src="/media/js/portal.master.js" type="text/javascript" language="javascript"></script>
<script language="javascript" type="text/javascript">
PORTAL.debug.init();
PORTAL.init();
</script>
<asp:ContentPlaceHolder ID="ScriptContent" runat="server" />
</head>
<body>
<div id="hld">
<div class="wrapper">
<form id="AspNetForm" runat="server">
<asp:ContentPlaceHolder ID="BodyContent" runat="server" />
</form>
<asp:ContentPlaceHolder ID="FooterContent" runat="server" />
</div>
</div>
</body>
我很难过。不知道为什么无法解决类型。有人得到建议吗?两个项目(预编译网站和客户端网站应用程序)都是为ASP.NET 4.0构建的。
编辑: :这是预编码组件的依赖项列表。没有第三方参考。
MSCORLIB,系统,System.Web
乳房1
好吧,此问题的快速解决方法是指定通往主页的完整路径。
<%@ Master Language="C#" Inherits="ASP.sitebase_master, App_Web_sitebase.master.cdcab7d2" %>
执行此操作后,我会收到以下错误:
尝试加载字符串资源时发生错误(FindResource失败了-2147023083)。
进行了一些研究之后,这似乎与HTML标记在主页中解析的方式有关。还不完全确定。我没有深入研究它。总体而言,我不敢相信这是共享控制的推荐方法,因为它绝对是愚蠢的。
更新2
我无法从中获得任何有价值的东西。它似乎在主题部分讨厌“脚本”标签,但我不知道为什么。主页与单个脚本有关。一旦我开始添加更多,我就会继续遇到错误。浪费了一整天后,我最终提交了 错误报告 致微软。如果有人想碰到它,请这样做。
更新3
我花了几天的时间在没有MS的回应后进行调试。这是我的发现。我最初认为,编码提供商生成的代码正在寻找一种.NET资源,该资源以某种方式在发布时并未将其嵌入到程序集中。我错了。经过一番调查,似乎正在发生的事情是在主页达到一定尺寸之后,其中一部分存储在汇编的PE数据目录部分中的资源表中。实际上,在查看PE资源查看器中生成的组件后,我能够通过在资源表中找到所有脚本包含的所有脚本来确认这一点。现在,这是实际问题。发生的事情是,编码提供商会生成呼叫Win32 FindResource,以从资源表中提取该资源。但是,FindResource仅在磁盘上对内存中的组件无效。因此,它失败了上述例外。我接近了,但仍然没有解决方法。
解决方案
我终于有解决方法。它不是很漂亮,但是可以解决这个问题。显然,使用LoadControl预先加载预编译的MasterPages加载了FindResource无法找到的所有资源。因此,这是我为这项工作所做的一切。
在我的客户端应用程序中,我创建了一个虚拟主页面(即虚拟Master),该页面引用了我的预编译主页:
<%@ Master Language="C#" Inherits="ASP.sitebase_master, App_Web_sitebase.master.cdcab7d2" %>
现在,任何引用虚拟的ASPX页面。Master都需要预编译预先编译的主页类型:
protected override void OnPreInit(EventArgs e) { ASP.sitebase_master mp = (ASP.sitebase_master)Page.LoadControl(typeof(ASP.sitebase_master), null); base.OnPreInit(e); }
我不知道为什么有效,但是确实如此。该代码必须在完成主页之前运行,因此预先启动效果很好。在反射器中浏览了.NET代码几秒钟后,似乎LoadControl实际上在尝试加载某种控制类型时会进行一些汇编voodoo。因此,也许其中的某些负载是PE资源数据部分。我想所有页面都可以继承的基类最好的位置。同样,每个加载的控件(在这种情况下为主页)都应被缓存。 这是一篇很好的文章来解释这一点。
希望这对某人对我有所帮助。对我来说,这是一个很大的表演塞子。