请问有谁知道 转换aspx 到 cs 的方法或工具?

解决方案 »

  1.   

    啥意思捏?没见过什么把aspx转成cs的。汗。。是VB。NET转成C#?
      

  2.   


    我有一个 aspx 文件 TestWebPage.aspx 其后台类为 TestWebPage.aspx.cs
    在浏览器访问该 aspx 后, .net 会在.net临时目录内把 aspx 文件转换为 随机文件名.cs,如下://------------------------------------------------------------------------------
    // <autogenerated>
    //     This code was generated by a tool.
    //     Runtime Version: 1.1.4322.2032
    //
    //     Changes to this file may cause incorrect behavior and will be lost if 
    //     the code is regenerated.
    // </autogenerated>
    //------------------------------------------------------------------------------namespace ASP {
        using System;
        using System.Collections;
        using System.Collections.Specialized;
        using System.Configuration;
        using System.Text;
        using System.Text.RegularExpressions;
        using System.Web;
        using System.Web.Caching;
        using System.Web.SessionState;
        using System.Web.Security;
        using System.Web.UI;
        using System.Web.UI.WebControls;
        using System.Web.UI.HtmlControls;
        using ASP;
        
        
        [System.Runtime.CompilerServices.CompilerGlobalScopeAttribute()]
        public class TestWebPage_aspx : My.TestWebPage, System.Web.SessionState.IRequiresSessionState {......---------------------看这一行:
    //     This code was generated by a tool.我就要这个 tool !!!!!!!
      

  3.   

    既然它提到System.Runtime.CompilerServices.CompilerGlobalScopeAttribute,那么你就在这个Path上面找找咯,应该是和Complier有关的。不过事情很可能会是你根本找不到,或者你用了例如Refactor这样的工具找到了也无法直接调用,因为负责这个事情的类是internal的。不过如果你遇到这样的情况也不要灰心,通过Callee Graph之类的功能找调用该internal类的类,你总能找到方法调用这个tool的。不过我很想问问楼主这样做是为什么?
      

  4.   

    首先我觉得这很没有必要。但是我还是先简单说说可以怎么做:运行时中断,查找Page所在装配件的地址,或者通过在页面上故意写错然后在asp.net的“编译错误”页面上察看“编译源代码”,可以得到asp.net自动为着个页面生成的cs类代码。然后把它放到一个cs文件里边,将个别由asp.net生成的命名改成你自己喜欢的命名,这样aspx就成了一个Page继承过来的组件了。通过在web.config中的handle设置这个或者这类页面从dll中启动,那么asp.net就会不再去找aspx文件,而是直接实例化编译过的页面类。我说为什么我觉得这意义不大。首先是这样的页面仍然很容易反编译。其次,是页面是需要RAD开发的,所以aspx和ascx才设计成这样,而编译成dll很麻烦。第三,如果你的技术精湛,你应该开发实用的、业务方面的UI组件,而将页面作为一个方便的引导和临时修饰组件属性的工具。
      

  5.   

    如果你对 CodeDom 感兴趣,可以在自己的项目中有真正需要的地方意识使用部分,这是asp.net应用层最高的境界。不过太难了。
      

  6.   

    如果不是要将 aspx 保存成类,而仅仅是想理解这个 tool 的大致流程,那么只要写一些页面,然后分析它通过 CodeDom 产生的结果代码就够了。
      

  7.   

    to cat_hsfz():
      这样做可以在编译项目的时候一并把所有的aspx都编译了...
      System.Runtime.CompilerServices,这个地方早就被我找遍了,能找到也不能到这里来问to sp1234():
      这样做的意义是很重大的,在java这是一个非常重要的组件
      你所的方法我早就试过了,不过我现在用她不是这个目的(我的目的见上)
      

  8.   

    你的意思是,你希望把code-beside的所有页面的代码自动提取出来然后就如code-behind一样把所有的代码都编译进dll?为什么在写的时候不直接用code-behind呢?首先你应该用Reflector这样的东西来查找你要的东西,不要用MSDN或者内置的类浏览器,因为你看不到internal的类与函数:
    http://www.aisto.com/roeder/dotnet
      

  9.   


    再换种说法吧,大家都知道,.aspx 第一次访问的时候要自动编译,我想拥有一个编译工具,可以自由地编译 .aspx
      

  10.   

    不是吧?那和ASP有什么分别了?
      

  11.   

    我不是很明白这个自由编译。如果你是使用code-beside方式书写,那么code就混合在html里面了,然后进行编译的时候你的html如何保留?去哪里了?其实code-behind所谓的编译,仅仅是指编译对象代码,混合在html里面的平板代码应该是不编译的,这些平板代码应该还是每一个Page.ProcessRequest()的时候利用PageParser进行处理的。这个问题我们应该这样理解:原本http协议和html都是平板式的(plain-text),在asp里面也完全是平板式的操作,但是在这个平板式输出操作上任何一个地方都可以操作另一个地方(因为它们都位于同一个平面,是平起平坐的),所以很不安全也难以维护,所以asp.net推出了用立体式的对象模型来维护http协议。request是平板式的进来,然后通过Controls把它立体化(类似并行化),然后进行处理,最后从新平板化(类似串行化)输出response。在这个过程中,只有立体部分能够进行编译,平板部分是不能被编译只能按照asp的老办法解释运行的。所以,如果你要完全编译一个asp.net应用,就必须保证这个应用是完全立体的(无html的)。(那就是说你只能通过Page.Controls.Add和Control.Controls.Add来描述页面。)而你要的自由编译,就必须是上述的完全编译,否则你的html放去哪?如果还是aspx+dll,那和code-behind无异啊。
      

  12.   


    大家居然还没明白我的意思.aspx 是能够被解释为 .cs 的,对吧!!!我就要一个工具来做这件事情,要最直接的,不要讲别的事情
      

  13.   

    .aspx能够被“局部”解释为.cs。仅仅当.aspx里面只有类代码而没有html混合代码时,.aspx才能被“完全”解释为.cs。
      

  14.   


    to cat_hsfz():
        对你这个观点我不知道说什么好,
        到 %windir%\Microsoft.NET\Framework\v1.1.4322\Temporary ASP.NET Files\ 下去看看吧
      

  15.   

    我也想知道.net在aspx执行之后把.aspx文件编译成了什么样的文件?向java虚拟机把jsp文件编译成.class文件一样。
      

  16.   


    .jsp 是先解释为.java 再编译为 .class 的.aspx 也是先解释为 .cs 再编译为 .dll 的这是众所周知的.jsp 解释为 .java 有一个组件来做:
        org.apache.jasper.JspC
    我想要的就是.aspx 的相应类似的一个东东.......
      

  17.   

    虽然已经结贴,我还是支持你的这个问题。ASP.NET确实是完全编译的,我用Reflector看过%windir%\Microsoft.NET\Framework\v1.1.4322\Temporary ASP.NET Files\里面缓存的dll了。我做了一个简单的纯asp页面:
    <html>
    <head>
    <title>Now!</title>
    </head>
    <body>
    <div><%=DateTime.Now%></div>
    </body>然后查看它的.dll,发现它自动生成了一个Page派生类,IRequiresSessionState也自动加上了,比普通的Page类多了一些双下划线开头的东西,例如两个双下划线开头的函数:
    private void __BuildControlTree(Control __ctrl)
    {
          __ctrl.SetRenderMethodDelegate(new RenderMethod(this.__Render__control1));
    }
     
    private void __Render__control1(HtmlTextWriter __output, Control parameterContainer)
    {
          __output.Write("<html>\r\n<head>\r\n<title>Now!</title>\r\n</head>\r\n<body>\r\n<div>");
          __output.Write(DateTime.Now);
          __output.Write("</div>\r\n</body>");
    }
     
    看来编译器会把html直接放到write的部分,<% %>中的逻辑再另外处理,例如Response.Write等效于等效于直接输出。至于它是怎么生成的,我还要研究研究才知道。另外这个功能不一定完全由CodeDom提供,可能CodeDom仅仅提供编译部分。Page类理论上是通过Parse来获取aspx里面的内容,然后把它们作为控件或者纯粹write出来的html添加到自己的内部,然而这时候得到的是一个对象的实例,不是一个类。假如由我设计ASP.NET,我会考虑是否存在可能性把一个实例转化为该类的派生类,或许ASP.NET真的是这样做的。而这个转化工作或许才是关键。
      

  18.   

    其实这个问题很值得研究,因为在.NET Framework中如果真的存在一个引擎能够将一个Page实例还原为源代码,那将是非常有用的。那样不仅仅输出能够cache,连动态生成的逻辑部分都能够cache了,而且是cache为dll效率绝对没问题。
      

  19.   


    相信现在还没有这样的工具,不然应该有人知道,也相信不久会有这样的组件出来,可能就叫 aspxc