ASP.NETフロントでバックグラウンドinternalタイプ変数にアクセスできない問題
4570 ワード
この文章は前の文章「ASP.NETフロントコードバインドバックグラウンド変数メソッドまとめ」の関連問題の分析と解答である.
前の記事では、コード非表示モードでは、フロントaspxファイルはinternal修飾のバックグラウンド変数にアクセスできませんが、publicまたはprotectedタイプの値にのみアクセスできます.明らかに問題そのものから見ると、フロントaspxとバックグラウンドに対応するaspxに違いない.csファイルは、コンパイル後に異なるプログラムセットで発生します(これはinternal修飾子の定義を分析することによって知ることができます).では、この問題を解決するには、彼らが本当に異なるプログラムセットにいるかどうかを見なければなりません.これはGetExecutingAssemblyによって実現できる.次の実装コード:
フロントコード:
バックグラウンドコード:
私が表示した結果は、(結果はプロジェクトの場所や関連設定によって異なります)
バックグラウンドセット: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でこの2つのdllを表示することで、フロントコードコンパイルはクラスを生成し、バックグラウンドコード生成のクラスを継承するため、フロントコードはprotectedタイプのバックグラウンド変数にアクセスすることができるが、同じプログラムセットではないためinternalはアクセスできない.
備考:この文はaspに限る.Net 2.0以降のコンパイル方式は、従来のasp.Net 1.1コンパイル方式が異なるため,各方式の結論が異なる可能性がある.
参考記事:
(回転)ASPを深く分析する.NETのコンパイル原理
ASP.NET 2.0のコンパイルモデルは完全にMSが言ったように
作成者:
lerit
出典:
http://www.cnblogs.com/lerit/
本文の著作権は著者とブログ園に共有され、転載を歓迎するが、著者の同意を得ずにこの声明を保留し、文章のページの明らかな位置で原文の接続を与えなければならない.そうしないと、法律責任を追及する権利を保留する.
http://www.cnblogs.com/lerit/archive/2010/10/25/1860433.html
前の記事では、コード非表示モードでは、フロント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でこの2つのdllを表示することで、フロントコードコンパイルはクラスを生成し、バックグラウンドコード生成のクラスを継承するため、フロントコードはprotectedタイプのバックグラウンド変数にアクセスすることができるが、同じプログラムセットではないためinternalはアクセスできない.
備考:この文はaspに限る.Net 2.0以降のコンパイル方式は、従来のasp.Net 1.1コンパイル方式が異なるため,各方式の結論が異なる可能性がある.
参考記事:
(回転)ASPを深く分析する.NETのコンパイル原理
ASP.NET 2.0のコンパイルモデルは完全にMSが言ったように
作成者:
lerit
出典:
http://www.cnblogs.com/lerit/
本文の著作権は著者とブログ園に共有され、転載を歓迎するが、著者の同意を得ずにこの声明を保留し、文章のページの明らかな位置で原文の接続を与えなければならない.そうしないと、法律責任を追及する権利を保留する.
http://www.cnblogs.com/lerit/archive/2010/10/25/1860433.html