ASP.NET 网站项目从开始(构建)到结束(运行时)如何实现自动生成的 ASP 命名空间?

Posted

技术标签:

【中文标题】ASP.NET 网站项目从开始(构建)到结束(运行时)如何实现自动生成的 ASP 命名空间?【英文标题】:How is the auto-generated ASP namespace realized for an ASP.NET website project, from start (build) to finish (runtime)? 【发布时间】:2011-10-24 12:36:38 【问题描述】:

“ASP”命名空间似乎是一个生成的,因为它没有在网站项目的源代码中使用,任何地方(或至少没有被网站程序员明确使用)。 我想知道它是如何完全实现的。

例如: MSBuild 是否有责任推动 ASP 命名空间的创建? 如果是这样,该指令在哪里找到?一世 知道 C# 编译器不会从任何东西中创建命名空间 它自己的意志,因此必须将 ASP 命名空间输入其中, 即使网站程序员不使用。也许是 由不同的工具生成到源代码中。这 “临时 ASP.NET 文件”文件夹可能与它有关。正如你 可以看到,我想要所有血淋淋的细节以便解锁和理解 那个命名空间...

Visual Studio 似乎有允许使用 ASP 命名空间的工具(对它的 IntelliSense 支持),但这掩盖了我对它的理解。

网站中的“ASP”命名空间从头到尾是如何实现的?

(我还没有找到解释这一切的好文章。)


这里的 ASP 命名空间显示在 .NET Reflector 中。 (本图取自Rick Strahl's blog)

【问题讨论】:

“ASP 命名空间”是什么意思?您是指 html 设计器的源视图中用于 Web 控件的前缀吗? @Rick - 是的,我相信它与编译后的 IL 中看到的相同,如 .NET Reflector west-wind.com/weblog/images/11/o_PageInheritance.png的截图所示 【参考方案1】:

ASP. 命名空间可用于动态加载自定义控件,使强制转换工作更安全。

您可以控制自定义控件在 ASP 中可以采用的名称。命名空间通过将ClassName="ControlClass" 放在命名空间的声明上,动态控件现在将引用ASP.ControlClass,以便在您使用LoadControl 时进行安全转换

您可以阅读 MSDN http://msdn.microsoft.com/en-us/library/c0az2h86(v=vs.100).aspx 上的完整步骤

当你不使用 ASP 时。命名空间并离开控件采用自动名称,则案例可能会失败(我不知道为什么,但它有时会在我的服务器上失败)创建的引用是

namespace ASP

    [CompilerGlobalScope]
    public class Control_Class_nameByDirectory : ControlClass
    
        [DebuggerNonUserCode]
        public ControlClass();

        protected override bool SupportAutoEvents  get; 

        [DebuggerNonUserCode]
        protected override void FrameworkInitialize();
    

当您尝试制作像(ControlClass)LoadControl("~/module/Control.ascs") 这样的演员时,它可能会失败,因为将其识别为Control_Class_nameByDirectory 而不是ControlClass

现在,如果您按照 MSD 的说明在控件标题上声明 ClassName,结果是控件将获得与您定义的 ClassName 相同的 ClassName:

namespace ASP

    [CompilerGlobalScope]
    public class ControlClass : global::ControlClass
    
        [DebuggerNonUserCode]
        public ControlClass();

        protected override bool SupportAutoEvents  get; 

        [DebuggerNonUserCode]
        protected override void FrameworkInitialize();
    

在这里,您可以使用ASP.ControlClass 来投射控件,而无需担心如果失败。

因此,按照http://msdn.microsoft.com/en-us/library/c0az2h86(v=vs.100).aspx 此处描述的步骤操作,您可以避免此类问题。 (而且我已经面对他们)

在不参考 ASP 的情况下无法对自定义控件进行大小写的问题。在 Dot net 4.0 和 4.5 版本中都可以看到命名空间。最糟糕的是,这是一个随机失败 - 这意味着有时会发生,有时不会,我无法找到原因。

【讨论】:

【参考方案2】:

此命名空间用于 ASP.NET 通过解析 .aspx 和 .ascx 文件生成的代码。

不过,我不知道你为什么在乎。它只是一个命名空间。它没有什么“特别”之处,您不应该引用该命名空间中的任何内容。


要了解所有这些工作原理,请阅读“ASP.NET Life Cycle”。

【讨论】:

John,它源于持续集成系统的问题。但是总的来说,即使从学术角度来看,我认为这是一个有效的问题,所以我很在意。不过,您是对的,作为开发人员,可能不需要关心。即使出于好奇,我也希望其他人在访问此问题时也能理解。 您知道它是如何从 aspx 和 ascx 文件中的解析信息中获取到最终编译的 DLL 的吗?我希望能解释它所经历的阶段和事情。 是的,我愿意。它被称为ASP.NET Life Cycle。请说明为什么您的 CI 系统需要知道这一点。我使用 TFS 对 Web 应用程序进行 CI,但不知道为什么任何代码都会关心它。特别是,我不知道微软已经保证他们如何生成他们的代码,所以问问你自己,如果命名空间的名称每天都改变,只是为了惹你生气,会发生什么? 顺便说一句,如果你问是因为你试图设置 CI 以使用 ASP.NET 网站(文件->新网站),那么我的回答是,“这是为什么不将 ASP.NET 网站用于严肃的工作”。相反,使用 File->New Project 创建一个 Web 应用程序项目(继续)。 John,我不想将 CI 问题与这个问题混为一谈。今天早些时候有人告诉我,一位开发人员发布了 CI 问题以支持,他可能对 SO 提出了一个明确的问题。 CI 问题是让我意识到我不理解这个命名空间的催化剂。我认为有一个可靠的答案是值得的,因为其他人对此有疑问,我想不出比 *** 更好的地方来寻求答案。在互联网上搜索后,我遇到了类似的问题,但没有任何可靠的。最终我会给它分配一个赏金,但我相信 SO 会占上风【参考方案3】:

我假设您正在寻找服务器控制标签上的前缀...如果不是这样,请告诉我。

前缀在 configuration/system.Web/pages/controls 下的 web.config 文件中注册。您可以根据需要对其进行修改,或者为您自己的控件库注册额外的前缀。

此处为 MSDN 信息:http://msdn.microsoft.com/en-us/library/ms164640.aspx

【讨论】:

我没有看到一个桥,在这个最初的答案中 - 如果那是 ASP 命名空间的来源,那么它是如何将它变成一个已编译的 DLL 的,还是它? @John - 不,我以为你说的不是这个。我以前没见过,但我承认我最近没有用 Reflector 来研究 Web 项目。 :-) 我会看看我是否在其他网络应用程序中看到相同的东西。

以上是关于ASP.NET 网站项目从开始(构建)到结束(运行时)如何实现自动生成的 ASP 命名空间?的主要内容,如果未能解决你的问题,请参考以下文章

旧的 Asp.Net 网站项目 - 没有项目文件?

Centos下安装Jexus.net,上传部署运行asp.net项目

从零开始构建一个的asp.net Core 项目

在构建后事件中使用命令部署 asp.net mvc 网站

ASP.NET 网站项目构建但发布时出错

Fiddler 没有从 ASP.NET 网站嗅探 SOAP 流量