[seasar-dotnet:2108] Re: QuillでAOPを試そうとして実行時にNullReferenceExceptionが発生する

kotani.k [E-MAIL ADDRESS DELETED]
2011年 10月 16日 (日) 17:59:26 JST


ASOさん、井上さん

こんにちは。
小谷(koyak)です。

こちらの方でも現象を再現できました。

アスペクトをかけるために使用している
Castle.DynamicProxyというライブラリの挙動が.NET4.0対応版と
それ以前で違っているらしく、「field.FieldType」をキーにした場合と
「implType」をキーにした場合で別々のインスタンスが設定されるようになっていました。

井上さんが提示して下さったようにInjectメソッドに渡す方(QuillInjector.cs 345行目)と
InvokeMemberを使ってインスタンスを設定する方(同352,353行目)で同じキーを
指定すれば正常に動くようになりますが、本当にその修正で問題がないのか
もう少し調査する予定です。

また、.NET4.0対応前のバージョン(1.3.18以前)では
当現象は発生しないことを同じテストコードを実行して確認しています。

以上です。

2011年10月13日23:24 kotani.k <[E-MAIL ADDRESS DELETED]>:
> 井上さん、ASOさん
>
> 小谷(koyak)です。
> フィードバックありがとうございます!
> こちらでも確認、検証してみようと思います。
>
> 2011年10月12日11:12  <[E-MAIL ADDRESS DELETED]>:
>>
>> 井上@TSC です。
>>
>> ASO様、
>> 動いて、何よりです。
>>
>> 久保(jflute)様、ならびにコミッタの皆様、よろしくお願いします。
>>
>>> もしよければ、その修正で色々と使い続けてみて、
>>> 全く動作(他の機能とか)に支障がないようであれば、
>>> その旨またメーリングリストに投稿して頂けると、
>>> 判断の重要な一要素となりますので助かります。
>>
>> Interface にImprementationAttributeを付けて
>> 実装クラスを指定し、連鎖してDIするとき、NULLになってしまうんですよね。
>>
>> QuillInjector.csの345行目付近は、1.3->1.4で変更されている部分ではないので、
>> どうかな?と思いつつも、修正して使っています。
>>
>> ただ、前後で
>> 342: QuillComponent component = container.GetComponent(field.FieldType,
>> implType);
>>
>> 352: target.GetType().InvokeMember(field.Name, bindingFlags, null, target,
>> 353:        new object[] { component.GetComponentObject(field.FieldType) });
>> と、field.FieldType基準で操作をしているので、
>> 345: Inject(component.GetComponentObject(implType));
>> より、
>> 345: Inject(component.GetComponentObject(field.FieldType));
>> の方が、自然な感じがします。
>>
>> 一応、半年ほどあれやこれやで使用していますが、特に問題は起きていないですね。
>>
>> 環境
>> Win7 32bit/Win2008R2 .NET Framework 4.0
>> Visual Studio 2010 Pro.
>> S2Container.NET 1.4.0 RC2
>>
>> 以 上.
>> _______________________________________________
>> seasar-dotnet mailing list
>> [E-MAIL ADDRESS DELETED]
>> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>>
>>
>


seasar-dotnet メーリングリストの案内