0

发布网站时,您有几个预编译选项。对于此示例,假设它是一个 .ascx 用户控件(尽管页面行为相似)并且选中“允许预编译的站点可更新”。这些是您拥有的一些选项:

  1. 不要预编译:用户控件内容保留在 .ascx 文件中,并根据需要编译到临时 ASP.NET 文件夹中。
  2. 预编译,不合并:主 DLL (projectName.dll) 略有不同,.ascx 消失,在任何地方都找不到 ascx 内容??
  3. 预编译,合并到单个程序集:主DLL略有不同,.ascx内容在新的单个程序集中,出现.compiled文件
  4. 预编译、合并页面和控件到单个程序集:几乎与#3 相同,单个程序集稍小(可能不包括顶级程序集)包含一些代码#3)与#3 相同但现在我们也有.编译文件。

方法:我使用 WinMerge 比较了 #1 和 #2 之间的发布输出,然后是 #2 和 #3 等等。我还从一个 ascx 中挑选了一个独特的词,并使用 Agent Ransack 搜索了发布输出(找到所有内容,而不仅仅是索引内容)。

问题:对于#2,用户控制的 HTML 内容在哪里结束?或者换句话说,如果没有在 DLL 中发布的 ascx 内容或没有 .compiled 文件,该站点如何工作?对于#1,它根据需要从 .ascx 中获取内容,但 #2 没有它可用。

编辑:该网站在我询问后立即变为只读,我意识到我的构建输出无效。我已经更新了这个问题,使其更加准确和彻底。

4

1 回答 1

1

它最终以一种或另一种方式在已发布的 bin 文件夹中生成的 .dll

.aspx 和 .ascx 文件生成控制对象树,其中 %>aaa<% 之间的所有字符串都被转换为 Literal("aaa") 并插入到正确位置的控制树中。

这些来自 Page(或您选择的基本 Page 类)和 WebUserControl 的类总是被编译但没有预编译它们驻留在临时 asp.net 文件夹中;通过预编译,它们会立即放入您的预编译包中。

例如下面的 .ascx

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="WebUserControl.ascx.cs" Inherits="WebUserControl" %>
<div class="customhtml">
    <asp:Label ID="Label1" runat="server" Text="<%#Page.Title %>"></asp:Label>
    <asp:Button ID="Button1" runat="server" Text="Button" />
</div>

结果如下(选项没有合并): webusercontrol.ascx.#hash#.compiled

<?xml version="1.0" encoding="utf-8"?>
<preserve resultType="3" virtualPath="/WebSite1/WebUserControl.ascx" hash="fffffff7f6e43006" filehash="8f74adc78f7714d1" flags="110000" assembly="App_Web_aslslubn" type="ASP.webusercontrol_ascx">
    <filedeps>
        <filedep name="/WebSite1/WebUserControl.ascx" />
        <filedep name="/WebSite1/WebUserControl.ascx.cs" />
    </filedeps>
</preserve>

这使您可以找到它编译成的程序集 - App_Web_#hash# 和类型 - ASP.webusercontrol_ascx

反汇编它会显示以下类声明:

using System;
using System.Diagnostics;
using System.Globalization;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace ASP
{
  public class webusercontrol_ascx : WebUserControl
  {
    private static bool __initialized;

    [DebuggerNonUserCode]
    public webusercontrol_ascx()
    {
      this.AppRelativeVirtualPath = "~/WebUserControl.ascx";
      if (webusercontrol_ascx.__initialized)
        return;
      webusercontrol_ascx.__initialized = true;
    }

    [DebuggerNonUserCode]
    private Label __BuildControlLabel1()
    {
      Label label = new Label();
      this.Label1 = label;
      label.ApplyStyleSheetSkin(this.Page);
      label.ID = "Label1";
      label.DataBinding += new EventHandler(this.__DataBindingLabel1);
      return label;
    }

    public void __DataBindingLabel1(object sender, EventArgs e)
    {
      Label label = (Label) sender;
      Control bindingContainer = label.BindingContainer;
      label.Text = Convert.ToString(this.Page.Title, (IFormatProvider) CultureInfo.CurrentCulture);
    }

    [DebuggerNonUserCode]
    private Button __BuildControlButton1()
    {
      Button button = new Button();
      this.Button1 = button;
      button.ApplyStyleSheetSkin(this.Page);
      button.ID = "Button1";
      button.Text = "Button";
      return button;
    }

    [DebuggerNonUserCode]
    private void __BuildControlTree(webusercontrol_ascx __ctrl)
    {
      IParserAccessor parserAccessor = (IParserAccessor) __ctrl;
      parserAccessor.AddParsedSubObject((object) new LiteralControl("\r\n<div class=\"customhtml\">\r\n    "));
      Label label = this.__BuildControlLabel1();
      parserAccessor.AddParsedSubObject((object) label);
      parserAccessor.AddParsedSubObject((object) new LiteralControl("\r\n    "));
      Button button = this.__BuildControlButton1();
      parserAccessor.AddParsedSubObject((object) button);
      parserAccessor.AddParsedSubObject((object) new LiteralControl("\r\n</div>\r\n"));
    }

    [DebuggerNonUserCode]
    protected override void FrameworkInitialize()
    {
      base.FrameworkInitialize();
      this.__BuildControlTree(this);
    }
  }
}

特别是,您可以在添加 LiteralControl 时找到您的 HTML 代码

[DebuggerNonUserCode]
private void __BuildControlTree(webusercontrol_ascx __ctrl)
{
  IParserAccessor parserAccessor = (IParserAccessor) __ctrl;
  parserAccessor.AddParsedSubObject((object) new LiteralControl("\r\n<div class=\"customhtml\">\r\n    "));
  Label label = this.__BuildControlLabel1();
  parserAccessor.AddParsedSubObject((object) label);
  parserAccessor.AddParsedSubObject((object) new LiteralControl("\r\n    "));
  Button button = this.__BuildControlButton1();
  parserAccessor.AddParsedSubObject((object) button);
  parserAccessor.AddParsedSubObject((object) new LiteralControl("\r\n</div>\r\n"));
}
于 2014-06-21T01:28:35.983 回答