DOBON.NET DOBON.NETプログラミング掲示板過去ログ

プログラム名を表示するクラス

環境/言語:[環境:WindowsXP sp2 言語:Visual Studio .NET 2003]
分類:[.NET]

フォームに貼り付けて置くだけで、実行しているプログラム名(ソリューション名)を表示するクラスを作成したいです。
各ソリューションでは、出力をEXEではなくクラスライブラリ(dll)にしています。
あとは、各dllを呼び出すようにしているのでタスクマネージャで確認すると
EXEがひとつ立ち上がっているだけです。
このような状況で各画面に、貼り付けられているdll名を表示するクラスを作成したいです。

私の調べる限りで試してみたところ
System.Reflection.Assembly.GetExecutingAssembly.EscapedCodeBase
の値を駆使して表示しても、この値を表示しているクラスを作っても
「このクラスを作成したdll」の名前を表示してしまい、貼り付けた各dllの
名前が表示できません。

長文になりましたが、皆様のお力添えいただけませんでしょうか。
各サブプログラム側に自分のを表示したいということですか?
(管理してるメニューフォームに今自分から実行させているサブプログラムを表示させる、ではないですよね?)
各LoadイベントでLabel1.Text=Me.GetType().FullName
とか。
全部に書きたくなければこれのあるForm継承クラスを作っておいて、
今後画面を作る場合にFormを継承する代わりにこれを継承すればできますが、
「この機能のみを付け加えた新しいクラス」というのもけっこう微妙な気はします。
(まぁ仕方ないか。)
> 各サブプログラム側に自分のを表示したいということですか?

そうです。自分のdll名を表示したいです。

> (管理してるメニューフォームに今自分から実行させているサブプログラムを表示させる、ではないですよね?)
> 各LoadイベントでLabel1.Text=Me.GetType().FullName
> とか。
> 全部に書きたくなければこれのあるForm継承クラスを作っておいて..

Form継承元クラス案も検討中です。
・・・が、一番ベストなのは「各画面に貼り付けるだけで、自分のdll名を表示
するLabelクラス」が作成したいのです。
Labelにも、LoadイベントがあればMe.GetType().FullNameが使用出来そうな
気はしているもののたどり着けず・・・
■No19346に返信(がばちょさんの記事)
> Labelにも、LoadイベントがあればMe.GetType().FullNameが使用出来そうな
> 気はしているもののたどり着けず・・・

それだと、そのコントロールが定義されているアセンブリの名前が出てきてしまいそう。

Labelの派生クラスを作って、

protected override void OnParentChanged( EventArgs e )
{
    if( this.Parent == null )
    {
        this.Text = string.Empty;
    }
    else
    {
        this.Text = this.Parent.GetType().Assembly.CodeBase;
    }

    base.OnParentChanged( e );
}

とかでどうだろう。
■No19348に返信(シャノンさんの記事)
> ■No19346に返信(がばちょさんの記事)
>>Labelにも、LoadイベントがあればMe.GetType().FullNameが使用出来そうな
>>気はしているもののたどり着けず・・・
>
> それだと、そのコントロールが定義されているアセンブリの名前が出てきてしまいそう。

そうですか・・・

> Labelの派生クラスを作って、
>
> protected override void OnParentChanged( EventArgs e )
> {
> if( this.Parent == null )
> {
> this.Text = string.Empty;
> }
> else
> {
> this.Text = this.Parent.GetType().Assembly.CodeBase;
> }
>
> base.OnParentChanged( e );
> }
>
> とかでどうだろう。

ご指示いただいたサンプルコーディングは何言語ですか?
申し訳ありませんが、微妙に書かれている内容が分かりません
2007/03/22(Thu) 17:13:26 編集(投稿者)

> ご指示いただいたサンプルコーディングは何言語ですか?
> 申し訳ありませんが、微妙に書かれている内容が分かりません
C#だと思いますよ。
がばちょさんVBかC#か指定されていないので…。

me.Parent.GetType().Assembly.CodeBaseだとファイルのパスになってしまうような。
me.TopLevelControl.GetType().FullNameか?

    Protected Overrides Sub OnParentChanged(ByVal e As EventArgs)
        If (me.TopLevelControl Is Nothing) Then
            me.Text = String.Empty
        Else
            me.Text = me.TopLevelControl.GetType().FullName
        End If

        MyBase.OnParentChanged(e)
    End Sub
入れ子も気にして一応こんな?
■No19351に返信(こど。さんの記事)
> 2007/03/22(Thu) 17:13:26 編集(投稿者)
>
> > ご指示いただいたサンプルコーディングは何言語ですか?
>>申し訳ありませんが、微妙に書かれている内容が分かりません
> C#だと思いますよ。
> がばちょさんVBかC#か指定されていないので…。

フォロー感謝。

> me.Parent.GetType().Assembly.CodeBaseだとファイルのパスになってしまうような。
> me.TopLevelControl.GetType().FullNameか?

それだとアセンブリ名なんだよね。
バージョンとか公開鍵トークンとかごてごてくっついて来ちゃう。
ファイル名だけ欲しいなら CodeBase を System.IO.Path あたりで解析するのがいいかなぁ、と。
GetType().Assembly.GetName().Name でもいいかもしれんね。

> 入れ子も気にして一応こんな?

そか。Parentだとコンテナ取っちゃう可能性があるのね。
でも、直接の親が変わらずにトップレベルフォームが変わった場合って、OnParentChanged で捕捉できるのかな。実験してみないと。
まぁ、一度貼り付けられたっきり変更されないなら OnParentChanged でいいし、null チェックも要らないけどね(Controls.Remove で取り除かれると null になる)。
ありがとうございました。皆様からご教授いただいた方法を
駆使して無事、作成する事が出来ました。

----------以下、今回作成した最終的なコーディング-------------
'プログラムIDの取得
Dim parts As String() '区切り文字で区切った文字列挿入用変数
Dim PrgId As String 'プログラムID
Dim delimiter1 As String = "/" '区切り文字1
Dim delimiter2 As String = "." '区切り文字2
Dim Licnt As Integer = 0 'ループ用カウンタ変数
Dim Target As String = Me.TopLevelControl.GetType().FullName '現在実行されているPRGの情報

'@まず区切り文字1の内容で区切った最後の文字列を取得()
parts = Split(Target, delimiter1, -1, CompareMethod.Text)
For Each s As String In parts
PrgId = s
Next
'A @で取得した文字から区切り文字2の内容で区切って、最後の文字列から一個前を取得
parts = Split(PrgId, delimiter2, -1, CompareMethod.Text)
For Each s As String In parts
Licnt += 1
Next
If Licnt > 1 Then Licnt -= 1
PrgId = parts(Licnt - 1)

'B取得した文字列をセット
MyBase.Text = PrgId
----------------------------------------------------------------
■No19359に返信(がばちょさんの記事)
> ありがとうございました。皆様からご教授いただいた方法を
> 駆使して無事、作成する事が出来ました。
>
> ----------以下、今回作成した最終的なコーディング-------------
> 'プログラムIDの取得
> Dim parts As String() '区切り文字で区切った文字列挿入用変数
> Dim PrgId As String 'プログラムID
> Dim delimiter1 As String = "/" '区切り文字1
> Dim delimiter2 As String = "." '区切り文字2
> Dim Licnt As Integer = 0 'ループ用カウンタ変数
> Dim Target As String = Me.TopLevelControl.GetType().FullName '現在実行されているPRGの情報
>
> '@まず区切り文字1の内容で区切った最後の文字列を取得()
> parts = Split(Target, delimiter1, -1, CompareMethod.Text)
> For Each s As String In parts
> PrgId = s
> Next
> 'A @で取得した文字から区切り文字2の内容で区切って、最後の文字列から一個前を取得
> parts = Split(PrgId, delimiter2, -1, CompareMethod.Text)
> For Each s As String In parts
> Licnt += 1
> Next
> If Licnt > 1 Then Licnt -= 1
> PrgId = parts(Licnt - 1)
>
> 'B取得した文字列をセット
> MyBase.Text = PrgId
> ----------------------------------------------------------------
>
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板