访问从ASPX / ASCX文件生成的源代码

时间:2010-03-03 18:54:29

标签: c# asp.net code-generation ascx

您可能已经注意到,当您调试来自ASPX或ASCX文件的错误(字面意思,而不是来自相应的代码隐藏文件)时,ASP.NET会显示一个错误页面,显示源文件和行发生错误的地方。正在显示的源文件是通过解析页面/控件自动生成的。问题是:如何在不故意导致异常的情况下查看此源文件?

我很想听到有一些编程方式(复杂性无关紧要)从一系列ASPX / ASCX文件生成源文件(最好是.cs)。

示例即可。考虑以下ASPX页面(代码隐藏文件甚至可能不存在):

<%@ Page Language="C#"%>
<%@ Register Assembly="AspxGen" Namespace="AspxGen" TagPrefix="ag" %>

<html>
  <head><title>Some Title</title></head>
  <body>
    <form id="form1" runat="server">
      <asp:Label runat="server" Text="<%# ThereIsNoSuchProperty %>" />
    </form>
  </body>
</html>

当我在浏览器中打开页面时,会显示以下错误:ASPX Compiler Error http://www.ko-sw.com/misc/sc_error_aspx.png

当我单击突出显示的链接时,它会显示发给C#编译器的命令:

C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE>
   "c:\WINDOWS\Microsoft.NET\Framework\v3.5\csc.exe" /t:library /utf8output
   /R: REFERENCES GO HERE
   /debug- /optimize+ /w:4 /nowarn:1659;1699;1701 /warnaserror-
  "c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\root\f66a2574\25dd72a2\App_Web_sqj3krv3.0.cs"
  "c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\root\f66a2574\25dd72a2\App_Web_sqj3krv3.1.cs"


Microsoft (R) Visual C# 2008 Compiler version 3.5.30729.1
for Microsoft (R) .NET Framework version 3.5
Copyright (C) Microsoft Corporation. All rights reserved.

d:\Dev\AspxGen\AspxGen\Default.aspx(9,80): error CS0103: The name 'ThereIsNoSuchProperty' does not exist in the current context

这意味着,理论上我可以打开传递给编译器的.CS文件(即App_Web_sqj3krv3.0.csApp_Web_sqj3krv3.1.cs)并查看ASP.NET从我的ASPX标记生成的内容。试着改写上一个问题:如何从任意ASPX文件中获取此文件(假设文件正确,因此不会给出搜索位置的信息)?

有关于此的任何提示吗?

3 个答案:

答案 0 :(得分:2)

您可以在以下目录中找到生成的代码:

  

C:\的Windows \ Microsoft.NET \框架\ V2.0.50727 \临时   ASP.NET文件

要确定确切的路径,请使用以下代码段。

System.Web.HttpRuntime.CodegenDir

ASP.NET使用BuildProviderCodeDOM为WebForms / UserControls生成代码。您可以创建自定义BuildProvider以生成特定扩展的自定义代码。请查看以下文章以获取更多信息。

http://aspalliance.com/1102

答案 1 :(得分:0)

您是否使用visual studio编写代码?如果是这样,您可以使用代码隐藏功能编写aspx页面的代码,该功能会生成.cs文件。

答案 2 :(得分:0)

ASP.Net页面,用户控件等都是“根据请求编译”。您看到的错误可能是“编译失败”而不是运行时失败。

您可以使用aspnet_compiler.exe来“预编译”您的网站。这将产生'占位符'.aspx文件和包含已编译类的程序集。

使用此工具,您将能够确定编译是否失败(使用aspnet_compiler.exe也很可能无法进行预编译)。否则,您将使用包含类的纯组件,这些类可以使用“Reflector”等工具进行反编译。

希望这有帮助,