[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 メーリングリストの案内