• ASP.NET前台无法访问后台internal类型变量的问题 [转]


    这篇文章是对前一篇文章《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 说的那样

    作者:lerit
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
     
  • 相关阅读:
    最近花了几个夜晚帮师妹整了一个企业网站
    英文学习网站
    Visual Studio 常用快捷键 (二)
    Visual Studio 常用快捷键
    学习英文之社区,博客及源码
    CodeForces 676D代码 哪里有问题呢?
    线程中调用python win32com
    Python 打包工具cx_freeze 问题记录及解决办法
    HDU1301 Jungle Roads
    HDU 1875 畅通工程再续
  • 原文地址:https://www.cnblogs.com/Godblessyou/p/1992223.html
Copyright © 2020-2023  润新知