为祖国健康工作50年

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  41 随笔 :: 0 文章 :: 383 评论 :: 32万 阅读
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

这篇文章是对前一篇文章《ASP.NET前台代码绑定后台变量方法总结》中一个相关问题的分析与解答。

上一篇文章说到,在代码隐藏模式下,前台aspx文件无法访问它的internal修饰的后台变量,而是只能访问public或者protected类型的值。显然从问题本身来看,一定是前台aspx和后台对应的aspx.cs文件,编译后在不同的程序集中导致的(这可以通过分析internal修饰符的定义得知)。那么要解决这个问题,就要看看他们是不是真的在不同程序集中。这可以通过GetExecutingAssembly来实现。以下实现的代码:

前台代码:

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <span>后台程序集: <%=GetVariableStr%></span> 
    <br />
    <span>前台程序集:
            <%=System.Reflection.Assembly.GetExecutingAssembly().CodeBase%></span>
    </form>
</body>
</html>

后台代码:

public partial class WebForm2 : System.Web.UI.Page
   {
       public string GetVariableStr;

       protected void Page_Load(object sender, EventArgs e)
       {
           if (!IsPostBack)
           {
               GetVariableStr = System.Reflection.Assembly.GetExecutingAssembly().CodeBase;
           }
       }
   }

我显示的结果是:(结果依项目位置和相关设置而不同)

后台程序集: file:///D:/project code/MyTestProject/MyTestWebProject/MyTestWebProject/bin/MyTestWebProject.DLL
前台程序集: file:///C:/Windows/Microsoft.NET/Framework/v4.0.30319/Temporary ASP.NET Files/mytestwebproject/4e3b6d4c/6fc8a242/App_Web_czkfai3a.DLL

可以看出,后台代码和前台代码分别位于了不同的程序集中,通过reflector查看这两个dll,前台代码编译生成了一个类,他继承了后台代码生成的类,因此,前台代码可以访问protected类型的后台变量,但是由于不在同一程序集,因此internal是不可访问的。

备注:此文限于asp.net 2.0及以后的编译方式,因为和之前的asp.net 1.1编译方式不同,因此各方式的结论可能有所不同。

参考文章:

(转)深入剖析ASP.NET的编译原理

ASP.NET 2.0 的编译模型并非完全像 MS 说的那样

posted on   lerit  阅读(2249)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
点击右上角即可分享
微信分享提示