最近项目中产生一个需求,需要对一个site下的每个aspx和其对应的cs文件封装进一个dll中,并且在web.config文件中通过配置httphandlers来实现访问。
查了半天资料,只找到了一篇还是讲.net 1.1的。照着方法做了以后,发现很多地方不合适,琢磨了半天,终于给我搞定。
以下是详细过程:
- 打开Visual Studio 2005,New一个Website Project
- 默认会创建一个Default页面,并且是没有namespace的,为了方便,添加namespace为Test,类名为Default,并且在页面上拖一个按钮,双击添加事件。处理完毕后,可见代码分别如下
[Default.aspx.cs]
[Default.aspx]
编译这个项目,确保成功,并且会在项目目录中添加一个Web.config文件。 - 在Default.aspx.cs页面添加几个乱字符,随便什么地方。这样做的目的是为了不让系统编译成功。
- 用之前访问Default.aspx页面的url访问该页面,会出现编译错误提醒页面。点击其中的[显示完整的编译源]链接,会显示编译错误的编译代码,可以注意到,aspx页面已经被某个没被公开的工具解析成了一段代码。[Code.cs]
复制这些代码到任意的支持正则表达式匹配的文本编辑器,替换掉所有的行号,#line default和#line hidden这样的编译器标识。删除顶部的checksum信息。删除所有的以#line开头的行。并且删除多余的空行。 - 注意到代码分成了两个部分,上半部分是Default class的部分类。下一部分是ASP.default_aspx class的内容,其实是Default.aspx解析了以后的结果。做如下处理:copy上半部分的分布类代码和Default.aspx.cs文件中的所有代码到一个文件中,比如:Default.cs,并且删除刚才添加的为了让编译器编译出错的那些代码。下半部分的代码也保存到另外一个部分的文件中,比如Default_Aspx.cs.处理后代码如下:
[Default.cs]
[Default_Aspx.cs]
屏蔽掉Default_Aspx.cs文件的以下几行
//private static bool @__initialized;
//private static object @__fileDependencies;
//string[] dependencies;
//if ((global::ASP.default_aspx.@__initialized == false))
//{
//dependencies = new string[2];
//dependencies[0] = “~/Default.aspx”;
//dependencies[1] = “~/Default.aspx.cs”;
//global::ASP.default_aspx.@__fileDependencies = this.GetWrappedFileDependencies(dependencies);
//global::ASP.default_aspx.@__initialized = true;
//}
//this.AddWrappedFileDependencies(global::ASP.default_aspx.@__fileDependencies);
[这几行是用来检查页面依赖是否有被改动过。] - 删除掉website中的Default.aspx页面和Default.aspx.cs文件,并且添加App_Code文件夹,将刚才保存的两个文件添加到该Website Project的该文件夹中,并且在Web.config文件中添加如下映射
<httpHandlers>
<add verb=”*” path=”Default.aspx” type=”ASP.default_aspx”/>
</httpHandlers>,
访问Default.aspx页面。就可以跳入刚才添加的两个文件进行调试。 - 如果想编译成dll的话,先用csc build Default.cs 为default.dll,再引入这个dll build Default_Aspx.cs。然后引用进这个项目就可以了。当然还是要删除App_Code文件夹下面的两个文件,否则会出现同名问题。
Over。
PS,在处理有图像的页面时,需要将相对路径转化成绝对路径,否则会有意想不到的事情发生。正在研究中。
PS,感谢浙江省绍兴市解放北路148号交通大厦六楼 周杰忻以及这篇参考