[seasar-dotnet:1512] Re: [Quill]AOP利用時、引数ウィンドウハンドルの値が変わってしまう。

Yuriko Ohguchi [E-MAIL ADDRESS DELETED]
2009年 10月 8日 (木) 14:36:54 JST


小谷さん

お世話になっております。大口です。
ご回答ありがとうございました。

ご提示いただいた3パターンを試したところ、
こちらでも値が変わることなく渡すことができました。

今回はリリース後なので修正できませんが
今後、同じような問題にあたったときは
クラスや構造体などでラップしたものを引数として渡すように
対応していきたいと思います。(パターン2の派生版ですね)

なぜか?の部分が気になるところですが
わかりましたらぜひ教えていただきたく思います。

以上です。
今後ともよろしくお願いいたします。


-----Original Message-----
From: [E-MAIL ADDRESS DELETED]
[mailto:[E-MAIL ADDRESS DELETED]] On Behalf Of koyak
Sent: Wednesday, October 07, 2009 11:38 PM
To: [E-MAIL ADDRESS DELETED]
Subject: [seasar-dotnet:1511] Re:[Quill]AOP利用時、引数ウィンドウハンドルの
値が変わってしまう。

大口さん

初めまして。
小谷と申します。

こちらの環境でも再現しました。

とりあえずの対処になってしまいますが、
以下の3パターンを試してみていただけないでしょうか。

1.引数をIntPtrではなくintにする。
(お使いのPCが64bitなら引数をlongにし、Handle.ToInt64を渡す
必要があるかもしれません)
ex.)
     public void Test1(int arg)
     {
            IntPtr h = new IntPtr(arg);
            (ハンドルhを使用したコード)
     }
 引数には「XXX.Test1(Handle.ToInt32());」という形で渡す

2.引数をIntPtrではなくIntPtr[](配列)にする。
ex.)
     public void Test1(IntPtr[] args)
     {
            IntPtr h = args[0];
            (ハンドルhを使用したコード)
     }
 引数には「XXX.Test1(new IntPtr[] { Handle };」という形で渡す

3.実装クラスを挟まないでインターフェース+AOPのみで使用する
 //サービス
ex.)
   [Implementation]
   public interface IHogeService2
   {
       [Aspect(typeof(InterceptorTest2 ))]
       void Test2(IntPtr h);
   }

 public class InterceptorTest2 : AbstractInterceptor
    {
        public override object
Invoke(Seasar.Framework.Aop.IMethodInvocation invocation)
        {
            IntPtr h = (IntPtr) invocation.Arguments[0];
            (ハンドルhを使用したコード)
        }
    }

こちらで試してみた限りでは上記パターンではハンドルの値が
変わることなく渡すことができました。
"実装クラスにAOPをかけ、引数にIntPtrを直接渡した場合"に
値が変わってしまうと思われます。

「何故そうなるのか?」は恥ずかしながらまだ分かりません。
(多分、値渡し−参照渡しの問題のような気がします)


2009年10月7日14:28 Yuriko Ohguchi <[E-MAIL ADDRESS DELETED]>:
> はじめまして、大口といいます。
>
> 今回初めてQuillを利用させていただきましたが
> 標題の件で困ってしまったため報告させていただきます。
>
> 開発環境:Microsoft Visual Studio 2005 Ver 8.0.50727.762  (SP.050727-7600)
> 開発言語:C#(.NET Framework Ver 2.0.50727 SP2)
> S2Container.NET 1.3.16.1利用
>
> Quillのコンテナで管理しているサービスにAOPを用いた際、
> サービスのメソッド引数に設定したウィンドウハンドルの値が
> 変更されてしまいました。
> (具体的には下記のサンプルソース および 実行結果 をご参照ください)
>
> 今回は、ウィンドウハンドルを渡す必要のあるメソッドには
> AOPを利用しないよう修正して対応をしましたが
> もっと根本的な解決方法はありませんでしょうか?
>
> ご教授よろしくお願いいたします。
>
>
> 以下、サンプルソースとなります。
>
> //フォーム
> namespace Seasar.S2FormExample.Forms
> {
>    public partial class FrmMainMenu : Form
>    {
>        protected IHogeService hogeService;
>        public FrmMainMenu()
>        {
>            InitializeComponent();
>        }
>        private void btnHoge_Click(object sender, EventArgs e)
>        {
>            System.Console.WriteLine("★A:" + Handle.ToString());   // ★A
>            hogeService.Test1(Handle);
>            hogeService.Test2(Handle);
>            System.Console.WriteLine("★D:" + Handle.ToString());   // ★D
>        }
>    }
> }
>
> //インターセプタ
> namespace Seasar.S2FormExample.Forms.Interceptor
> {
>    public class ConsoleWriteInterceptor : IMethodInterceptor
>    {
>        public object Invoke(IMethodInvocation invocation)
>        {
>            MethodBase method = invocation.Method;
>            Console.WriteLine("メソッドを開始します");
>            object ret = invocation.Proceed();
>            Console.WriteLine("メソッドを終了します");
>            return ret;
>        }
>    }
> }
>
> //サービス
> namespace Seasar.S2FormExample.Logics.Service
> {
>    [Implementation(typeof(HogeServiceImpl))]
>    public interface IHogeService
>    {
>        void Test1(IntPtr h);
>        void Test2(IntPtr h);
>    }
> }
> namespace Seasar.S2FormExample.Logics.Service.Impl
> {
>    public class HogeServiceImpl : IHogeService
>    {
>        public void Test1(IntPtr h)
>        {
>            System.Console.WriteLine("★B:" + h.ToString());   // ★B
>        }
>
>        [Aspect(typeof(ConsoleWriteInterceptor))]
>        public void Test2(IntPtr h)
>        {
>            System.Console.WriteLine("★C:" + h.ToString());   // ★C
>        }
>    }
> }
>
>
> <<実行結果>>
> ★A:1313154
> ★B:21142624
> メソッドを開始します
> ★C:21142996
> メソッドを終了します
> ★D:1313154
>
> ※期待値は、★C、★Dともに「1313154」です。
>
> <<補足>>
> ・QuillのTransaction属性を利用した際も、この現象は発生しました。
> ・S2コンテナを利用したサービスにきりかえた場合や
> Quill利用でも、AOPを利用しない(DIのみ)の場合では
> このような現象はありませんでした。
>
>
> 以上です。
> よろしくお願いいたします。
>
>
> _______________________________________________
> seasar-dotnet mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>
_______________________________________________
seasar-dotnet mailing list
[E-MAIL ADDRESS DELETED]
https://ml.seasar.org/mailman/listinfo/seasar-dotnet




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