[CONTAINERNET-122] {Quill}: ログ出力の名前空間による原因での例外 Created: 2009-05-16  Updated: 2009-05-24  Resolved: 2009-05-24

Status: Resolved
Project: S2Container.NET
Component/s: Quill
Affects Version/s: None
Fix Version/s: 1.3.16

Type: Bug Priority: Major
Reporter: jflute Assignee: koyak
Resolution: Fixed Votes: 0
Labels: None


 Description   

http://d.hatena.ne.jp/jflute/20090512#c1242229597
Quillのフィードバックを頂きました。ひとまず転記します。
情報が足りないかもしれないので、再度情報を頂く必要があるかもしれません。

1.メッセージ出力の不具合?
私の環境ではQuillがSeasar.Framework.Log.Loggerを利用してログを出力する際に例外が発生します。
原因を調べてみました。
問題の根源はQuillプロジェクトの「規定の名前空間」にSeasar.Quillが指定されていることのようです。
追加の情報として下記のポイントも合わせてご確認ください。
・Seasar.Quill.Util.MessageUtil
・QuillプロジェクトのResources.resx
※「規定の名前空間」は無指定がよいかもしれません

ひとまず思いついたポイント:

o Quillプロジェクトの「規定の名前空間」にSeasar.Quillが指定されているか否かの確認
o 現象が再現するかどうか?(環境の確認が必要!?VB.NET!?)
o 一般的に「(フレームワークプロジェクトの)規定の名前空間」は何にするべきなのか?
o 「規定の名前空間」は無指定でも問題はないのか?



 Comments   
Comment by koyak [ 2009-05-24 ]

Seasar.Testは既定の名前空間を空にすると
テストで各種リソースファイル(フルパスで直接している場合)が
見つからず大量にエラーとなるので除外。

下記プロジェクトについてのみ既定の名前空間を空欄にしました。
・Seasar.Dxo
・Seasar.Quill
・Seasar.Windows

Comment by koyak [ 2009-05-23 ]

・変更対象
Seasar.Dxo
Seasar.Quill
Seaser.Tests
Seasar.Windows
の「既定の名前空間」

・修正内容
既定の名前空間を空欄にする。

Comment by koyak [ 2009-05-23 ]

Seasar、Seasar.Daoのフォルダ名が「Seasar.Extension.Tx」みたいな
ネーミングになっている理由を今更ながら理解しましたw

未指定にしてテスト結果に影響が出ないようであれば
(多分出ないと思いますけど)
既定の名前空間は未指定でいこうと思います。

フォルダ名は・・・これもver.1.4を出すときかな。

Comment by rmiyax [ 2009-05-20 ]

VisualStudio2008のプロジェクトから、既定のリソースを作成すれば、
リソースファイルがResourcesという内部クラスに変換されるので
プログラムからは、既定の名前空間を意識する必要は無くなります。
詳細:http://msdn.microsoft.com/ja-jp/library/7k989cfy(vs.80).aspx

ただ、Seasar.Framework.LogのLoggerのように
メッセージコードからリソースファイルを自動的に探してくれたり
メッセージの先頭にメッセージコードを付けてくれるわけではないので、うまくラッパークラスを実装する必要があります。
(自分はうまく実装できなかったので、自作アプリケーションのリソースは、Resourcesクラスを直接参照するようにしました。
このほうがリソースを削除したときにコンパイルエラーが出て使いやすかったので)

とりあえず
Seasar, Seasar.Daoと同じように
未指定にしていいと思います。

ただ、注意しないといけないのが
Visual Studioからクラスを新規追加したときの名前空間の初期値が、
"既定の名前空間" + フォルダ名
になるので、手動で名前空間を直す必要があるということです。

もしくは、"フォルダ名"を"名前空間を含んだフォルダ名"に変更しておくとか
例1:Attrs → Seasar.Quill.Attrs
例2:Dao → Seasar.Dao

Comment by jflute [ 2009-05-20 ]

既定の名前空間って、なんかいつどこでも不便だのぅ。。。

> 既定の名前空間が「Seasar.Quill」だった場合、リソース名は
> 「Seasar.Quill.QLLMessages」と指定しなければならないが、

既定の名前空間を設定すると、リソース取得するときに、
その名前空間を意識してプログラム書かないといけないのか!?

とりあえず未指定にしちゃっていいかもね。

Comment by koyak [ 2009-05-20 ]

http://www.atmarkit.co.jp/fdotnet/dotnettips/220resources3/resources3.html

>【マニフェスト・リソースの命名規則(Visual C#)】は、次のとおり。
 <既定の名前空間>.<フォルダ名>.<ファイル名>

QLLMessages.resx(とQLLMessages.ja-JP.resx)はプロジェクトの直下に置かれているので
<フォルダ名>はなし。
既定の名前空間が「Seasar.Quill」だった場合、リソース名は
「Seasar.Quill.QLLMessages」と指定しなければならないが、
Seasar.Framework.LogのLoggerクラスのLog()メソッドを呼び出した場合、
名前空間(Seasar.Quill)を指定することができないため
指定するリソース名が「QLLMessages」となってしまう。

試しにリソース名を指定するところ
(Seasar.Framework.Message.MessageFormatter#GetMessages のResourceManagerをnewしている箇所)
でリソース名に"Seasar.Quill."を追加してやると
例外は発生せずに正常にメッセージリソースからメッセージを取得した形で出力される。

・・・「既定の名前空間」ってクラスを新しく追加したときのデフォルトnamaspaceにしか
関係ないと思ってました。

Comment by koyak [ 2009-05-20 ]

>(これって、Seasar.Framework.LogのLoggerクラスのLog()メソッドでいいよね?)
はい(^^;

下記例外が発生します。
が、この例外が発生する部分はtry~catchで握りつぶされており
この場合はメッセージコードと一緒に渡しているパラメータだけが
ログに出力され、異常終了することなく処理は続きます。

System.Resources.MissingManifestResourceException: 指定されたカルチャまたはニュートラル カルチャに対して適切なリソースが見つかりませんでした。"QLLMessages.resources" が適切に埋め込まれたか、実行時にアセンブリ "Seasar.Quill" にリンクされたか、または必要なサテライト アセンブリが読み込まれて完全に署名されていることを確認してください。
場所 System.Resources.ResourceManager.InternalGetResourceSet(CultureInfo culture, Boolean createIfNotExists, Boolean tryParents)
(略)
場所 Seasar.Framework.Message.MessageFormatter.GetPattern(String nameSpace, String messageCode, Assembly assembly) 場所 C:\source\seasar\seasar-dotnet\source\Seasar\Seasar.Framework.Message\MessageFormatter.cs:行 114
場所 Seasar.Framework.Message.MessageFormatter.GetSimpleMessage(String messageCode, Object[] arguments, Assembly assembly, String nameSpace) 場所 C:\source\seasar\seasar-dotnet\source\Seasar\Seasar.Framework.Message\MessageFormatter.cs:行 90

Comment by jflute [ 2009-05-18 ]

ふーむー、まあ無指定で統一するのがにするのが良いかなというところだね。
(既定の名前空間はDBFluteの外だしSQLでもややこしい問題あったし...ややこしい...)

それにしても、Seasar.Framework.Log#Log()だと出力されないって、
(これって、Seasar.Framework.LogのLoggerクラスのLog()メソッドでいいよね?)
具体的にはIsEnabledFor()がfalseでArgumentExceptionが発生してるってことでしょうか?
(で、これで既定の名前空間を無指定にすると大丈夫ってのがよくわからない...)

Comment by koyak [ 2009-05-18 ]

○Quillプロジェクトの「規定の名前空間」にSeasar.Quillが指定されているか否かの確認
 Seasar,Seasar.Dao,Seasar.Unitは無指定。
 他(Quill含む)はアセンブリ名と同じものが付けられている。

o 現象が再現するかどうか?(環境の確認が必要!?VB.NET!?)
 C#でも再現する。
 Seasar.Framework.Log#Log
を使った場合はメッセージが出力されない。
 (DebugやInfoメソッドを使った場合は出力される。

 既定名前空間を空白にすると出力されるようになる。

o 一般的に「(フレームワークプロジェクトの)規定の名前空間」は何にするべきなのか?
 MS的には何らかの設定が行われることを期待していると思われる。
 根拠:VisualStudioから既定の名前空間を空にしようとすると警告が表示され、変更できないため。
 (プロジェクトファイルをメモ帳などで直接編集すると空にすることができる)

 世間一般のプロジェクトでどうしているかは不明。
 (自分が関わったことがあるプロジェクトではこの辺はデフォルトのまま)

o 「規定の名前空間」は無指定でも問題はないのか?
 Seasar,Seasar.Daoは無指定になっているが
 これまでここが無指定なために発生する問題は聞いたことがない。
 聞いたことがないからと言って問題が絶対発生しない、とは言えないが、
 現状では無指定にして何か問題が発生する確率は低いと思われる。
 (こちらも調査か!?)

Comment by koyak [ 2009-05-16 ]

不具合の可能性あり、ということで
CONTAINERNET-122~125の中では
一番優先度が高そうですね。

調べてみようと思います。

Generated at Mon Dec 15 06:31:32 JST 2025 using Jira 10.6.1#10060001-sha1:a6461e220f274b29ced7ac9295492f2465fe5ef5.