我正在尝试预编译一些主页(不可更新),以在多个应用程序中共享它们。我预先编译的项目是一个网站。引用预编码的项目是一个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资源数据部分。我想所有页面都可以继承的基类最好的位置。同样,每个加载的控件(在这种情况下为主页)都应被缓存。 这是一篇很好的文章来解释这一点。

希望这对某人对我有所帮助。对我来说,这是一个很大的表演塞子。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top