C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: クラスライブラリプロジェクトのルート名前空間名を取得したい


(過去ログ 98 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■58580 / inTopicNo.1)  クラスライブラリプロジェクトのルート名前空間名を取得したい
  
□投稿者/ Mira (27回)-(2011/04/15(Fri) 18:18:30)

分類:[ASP.NET (VB)] 

2011/04/18(Mon) 12:11:48 編集(投稿者)

件名の通り
クラスライブラリプロジェクトのルート名前空間をコード上で取得したいのですが何か方法はないでしょうか?

Me.GetType.Namespaceですと

プロジェクトのルート名前空間 +"." + クラスに設定されている名前空間になってしまい

プロジェクトのルート名前空間だけを取得することができません

プロジェクトのルート名前空間かもしくはクラスに設定した名前空間のどちらかを取得できればなんとかなるのですが
何か方法はあるでしょうか?

#分類の変更しました
引用返信 編集キー/
■58582 / inTopicNo.2)  Re[1]: クラスライブラリプロジェクトのルート名前空間名を取得したい
□投稿者/ todo (134回)-(2011/04/15(Fri) 18:48:13)
自アセンブリ名を取得する
http://homepage1.nifty.com/rucio/main/dotnet/Samples151/Sample152AsssemblyName.htm
引用返信 編集キー/
■58583 / inTopicNo.3)  Re[2]: クラスライブラリプロジェクトのルート名前空間名を取得したい
□投稿者/ Mira (28回)-(2011/04/15(Fri) 19:16:37)
todoさんありがとうございます

アセンブリ名とルート名前空間が同じ場合は問題ないのですが
変えた場合の取得方法を探していますm(_ _)m
引用返信 編集キー/
■58586 / inTopicNo.4)  Re[1]: クラスライブラリプロジェクトのルート名前空間名を取得したい
□投稿者/ shu (623回)-(2011/04/15(Fri) 22:13:33)
No58580 (Mira さん) に返信
> プロジェクトのルート名前空間 +"." + クラスに設定されている名前空間になってしまい
>
> プロジェクトのルート名前空間だけを取得することができません
『.』までを取得すればよいのでは?
引用返信 編集キー/
■58588 / inTopicNo.5)  Re[2]: クラスライブラリプロジェクトのルート名前空間名を取得したい
□投稿者/ じゃんぬねっと (67回)-(2011/04/16(Sat) 03:03:43)
じゃんぬねっと さんの Web サイト
質問者様の "ルート名前空間" とは IDE 上のプロジェクトのプロパティに含まれている 「ルート名前空間 (/RootNamespace)」 のことでしょうか?
それとも 「名前空間 (完全修飾名) "の" ルート」 のことでしょうか?

> プロジェクトのルート名前空間 +"." + クラスに設定されている名前空間になってしまい
> プロジェクトのルート名前空間だけを取得することができません
> プロジェクトのルート名前空間かもしくはクラスに設定した名前空間のどちらかを取得できればなんとかなるのですが

最後に書かれた内容を見ると、「名前空間 "の" ルートで良い」 と仰られているように見えますが、「名前空間 "の" ルート」 とプロジェクトのプロパティにおける 「ルート名前空間」 は必ずしもイコールではありません。

もしこの前提をご存知ではなく、上記のように書かれているのでしたら、要件次第では見直しが必要かと存じます。
(個人的にも 「そのような情報が必要な要件って何だろう?」 と興味があります)

<<以下は 「ルート名前空間」 の場合のお話になります>>

私はこのあたり (も?) 明るくないので、間違っているかもしれませんが...
アセンブリからだと 「ルート名前空間」 の取得は無理なように思えます。
(「名前空間 "の" ルート」 であれば、すでに回答がついているとおり可能です)

ルート名前空間は IDE 事情の設定な気がしてなりません。
またアセンブリからしても必須とまでは言えない情報です。

もちろんメタデータとしては、存在価値はあるように思えますが、名前空間のパスは、ルート名前空間をルートとしないものが指定できます。
ですので、アセンブリにルート名前空間の情報が別枠で含まれない限り、取得できないということにならないでしょうか。
(メタ情報としては、クラス名、名前空間、完全修飾名しかなかったように思えます)

C# では namespace キーワードでルート名前空間をシカトしたフリーダムな名前空間が普通に設定可能です。
VB では省略扱いであり、普通に書くとルート名前空間が否応なしに含まれてしまうので Namespace ステートメントで Global キーワードを使って.. って使えないじゃないか、ゴルァ!!
MSDN ライブラリには Namespace でもグローバル名前空間エイリアスは使えるって書いてあるのに嘘つき!! (w

[追記]
"ルート名前空間は IDE 事情の設定な気がしてなりません" の詳細は下記のとおりです。

IDE 上のルート名前空間の扱い (存在) は C#、VB、J# の 3 つを挙げるだけでも大きく異なります。
C# だと IDE でコード ジェネレータがデフォルトで出力する名前空間のルートという扱いですが、VB では省略されている名前空間のルートとなります。

たとえば、IDE のルート名前空間の設定が 'Root' だった場合

<C#>
namespace Root {
  public class Hoge {
    :
  }
}

<VB>
Namespace Root
  Public Class Hoge
    :
  End Class
End Namespace

同じような書き方をしていますが、実は完全修飾名は C# と VB では異なります。
C# では Hoge の完全修飾名は 'Root.Hoge' ですが、VB では 'Root.Root.Hoge' なんてことになります。

というわけで、C# も VB のような動作をしていればともかく、どうもアセンブリ事情の情報ではない気がするわけです。

[さらに追記]

コンパイラ オプションに /rootnamespace: なんてパラメータがあります。
これはコンパイル時に使われる情報であり、アセンブリには含まれないようです。
このパラメータが直接関係するのは VB であり、C# では一部を除き関係しません。
VB で直接関係する理由としては、先に述べたとおり、

> C# だと IDE でコード ジェネレータがデフォルトで出力する名前空間のルートという扱いですが、
> VB では省略されている名前空間のルートとなります。

この部分の違いに因るものです (ルートを補足しているから)。
引用返信 編集キー/
■58605 / inTopicNo.6)  Re[3]: クラスライブラリプロジェクトのルート名前空間名を取得したい
□投稿者/ Mira (30回)-(2011/04/18(Mon) 12:33:06)
Shuさん、じゃんぬねっとさん回答ありがとうございます

まず自分の環境を書いてませんでした 環境はVB2005です

> 「ルート名前空間 (/RootNamespace)」 のことでしょうか?それとも 「名前空間 (完全修飾名) "の" ルート」 のことでしょうか?
前者となります。プロジェクトのプロパティで設定できるルート名前空間のことです

なぜ必要かといいますと。プロジェクトに埋め込まれたリソースにアクセスするためです
ClientScript.RegisterClientScriptResource等を行う場合リソース名は
(私が検証した結果なので間違っていたら指摘お願いします)

「ルート名前空間」 + "." + 「リソース名」となるので
ルート名前空間を動的に取得してクラス内に記述したいと思っています

理由は一つのクラスファイルが複数のプロジェクトにリンクで参照されているためです
(ここは見直せない状態です)

今のところ複数のプロジェクトに設定しているルート名前空間は名前空間 (完全修飾名) のルートと一致しているので
Shuさんから頂いた回答で応急的に処置していますがルート名前空間名を「HogeA.HogeB」等にしてしまうと
対応ができなくなるのでその場合の対処法を知りたいのですm(_ _)m

よろしくお願いします
引用返信 編集キー/
■58614 / inTopicNo.7)  Re[4]: クラスライブラリプロジェクトのルート名前空間名を取得したい
□投稿者/ shu (628回)-(2011/04/18(Mon) 13:40:38)
No58605 (Mira さん) に返信

ルート名前空間直下にあるモジュール『modA』内において『GetType(modA).Namespace()』
はルート名前空間を返します。クラス毎に取得するのではなく、プロジェクト内に1個この
モジュールがあれば目的は達成出来そうですね。
引用返信 編集キー/
■58619 / inTopicNo.8)  Re[5]: クラスライブラリプロジェクトのルート名前空間名を取得したい
□投稿者/ Mira (31回)-(2011/04/18(Mon) 14:25:21)
> ルート名前空間直下にあるモジュール『modA』内において『GetType(modA).Namespace()』
> はルート名前空間を返します。クラス毎に取得するのではなく、プロジェクト内に1個この
> モジュールがあれば目的は達成出来そうですね。

shuさん回答ありがとうございます
その発想はすばらしい!!無事に実装できました。ありがとうございました
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -