- PR -

コードビハインドされたファイルから、静的メンバを呼び出せない

投稿者投稿内容
きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2005-10-20 19:32
Dr.Manciniさん、こんばんは。

引用:

の書き込み (2005-10-20 19:23) より:
> コードビハインドの場合、その、ビハインドのソースは自分でコンパイルして、
> DLLの形態で配置する必要があります。
>
そうでしたか・・・自分なりにも調べてみましたが、初めて知りました。


ごめんなさい、大ウソぶっこいてしまいました。
前回の私の投稿にある、2 つ目のリンクの方を良〜く見たら、実行時にもコンパイルされる、という事が記述されてました…。申し訳ない。m(_ _)m

【追記】
Codebehind 属性ではなくて src 属性で指定するんですね…。


[ メッセージ編集済み 編集者: きくちゃん 編集日時 2005-10-20 19:39 ]
Dr.Mancini
常連さん
会議室デビュー日: 2003/01/23
投稿数: 35
投稿日時: 2005-10-20 19:38
> 前回の私の投稿にある、2 つ目のリンクの方を良〜く見たら、
> 実行時にもコンパイルされる、という事が記述されてました…。
> 申し訳ない。m(_ _)m
>
いえいえ・・・とりあえず、従来通りApplication変数を使って凌ぐことにしました。
案外難しいものですね・・・。
きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2005-10-24 13:18
Dr.Manciniさん、こんにちは。

引用:

いえいえ・・・とりあえず、従来通りApplication変数を使って凌ぐことにしました。


ということなので、もう見てないかも知れませんが、自分自身、興味もありましたので…。

試しに、アプリケーションディレクトリに index.aspx、index.aspx.vb、Global.asax、Global.asax.cs の 4 つのファイルを配置して実行してみたところ、%windir%\Microsoft.NET\Framework\v1.1.4322\Temporary ASP.NET Files\ の該当フォルダ内に、それぞれのソースファイルに対応すると思われる 4 つの DLL ファイルが作成されていました。
IDE から ビルドを実行すると、ビハインドのソースは事前にコンパイルされ、単一のDLL(アセンブリ)となるために問題とはならないのですが、実行時コンパイルに任せると、それぞれが別の DLL となり、参照関係がどこかで指定されない限り今回のようなコンパイルエラーが発生してしまうのではないでしょうか(推測ですが)。
ただ、aspx および asax ファイル側については、特に何もしなくても同一アプリケーション内のメンバとして認識されるため、aspx ファイル内のインラインコードから、Global クラスのメンバにアクセスすることは可能でした(Global.asax が Global を継承しているからですね)。

ということは、どこかで アセンブリの参照設定が出来れば良いのではないかと思い、 @ Page ディレクティブの CompilerOptions 属性とか、web.config の probing だとか assemblies だとかの要素についてざっと調べてみたのですが、DLL の名前なんかも動的に決定されるみたいですし、ちょっと難しそうでした。

そこで、もしやと思い、ビハインドコードを単一のファイルに記述し(ということで記述言語は統一)、aspx および asax の Src 属性に、その、同じファイル名を指定してみました。
結果、生成された DLL は 3 つ。
同名のクラスを持つ別のアセンブリが生成される可能性もあったわけですが、実行したところ、aspx のビハインド側、インライン側ともに、ちゃんと同じものを見ているようです。

まあ、もしかしたらこんな事わざわざ実験しなくとも、どこかでこの辺の仕様が公開されているのかも知れませんが、ちょっと見つけられませんでしたので…。

コード:
【index.aspx】
<%@ Page Language="vb" AutoEventWireup="false" Src="all.vb" Inherits="index" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
  <HEAD>
    <title><% = Global.Hoge %></title>
  </HEAD>
  <body>
    <form id="Form1" method="post" runat="server">
        <asp:Button id="Button1" runat="server" Text="Button"></asp:Button>
        <br>
        <asp:TextBox id="TextBox1" runat="server"></asp:TextBox>
    </form>
  </body>
</HTML>


【Global.asax】
<%@ Application Src="all.vb" Inherits="Global" %>


【all.vb】

Imports System
Imports System.Web
Imports System.Web.UI
Imports System.Web.SessionState

Public Class Global
	Inherits System.Web.HttpApplication

    Public Shared Hoge As String

    Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
        Global.Hoge = "hogehoge"
    End Sub

End Class

Public Class index
    Inherits System.Web.UI.Page

    Protected WithEvents TextBox1 As System.Web.UI.WebControls.TextBox
    Protected WithEvents Button1 As System.Web.UI.WebControls.Button

	Private Sub Page_Load(ByVal sender As Object, _
	ByVal e As System.EventArgs) Handles MyBase.Load
	    If (Not IsPostBack) Then
			TextBox1.Text = Global.Hoge
	    End If
	End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles Button1.Click
        Global.Hoge = TextBox1.Text
	End Sub

End Class




Dr.Mancini
常連さん
会議室デビュー日: 2003/01/23
投稿数: 35
投稿日時: 2005-10-24 13:48
きくちゃんさん、こんにちは。
わざわざ調べて頂いて、ありがとうございました。
内容について理解できました。

ビハインドコードを共通化させるという事ですが、
あとあと管理が厄介になりそうなので定数の参照にはApplication変数を使うことにします。
しかし仕組みが理解できたので、すっきりしました。
やはりASP.NETはIDEを使うのがよさそうです。

スキルアップ/キャリアアップ(JOB@IT)