|
From: Ruurd B. <SZ...@sz...> - 2005-02-04 12:26:52
|
Hi all,
let me quickly introduce myself, since I'm new to this list. I'm Ruurd
Boeke, freelance architect/developer in the Netherlands. At this moment
I'm working on a (very) large project for the government.
I've stumbled on Aspect# because of a request from my teamlead and
reading about aspect oriented programming as used in nhibernate and
blogs.
Please excuse me, if the following question is not supposed to be asked
on this mailing list. Your wiki is down ;-(
We are already in the finishing stages of our project and will start
deliviring within months. We have a server-client setup using remoting.
I was challenged to build the following simple functionality: without
changing the calls to the remote objects, implement a wait cursor while
the client is waiting for the return value.
(Keep in mind that I've just started using aspect# a few hours ago, so
if my approach is very silly, please correct me without holding back!)
I must say that I'm _very_ pleased with the ease that I could implement
aspect# on this. I've taken the following steps:
* In our framework where the remote object was activated with : object
requestedInterface = Activator.GetObject(interfaceType, url.ToString());
I changed the call to: object requestedInterface =
engine.WrapInterface(interfaceType, Activator.GetObject(interfaceType,
url.ToString()));
* The code to build the engine:
String contents = " import Socrates.Client.Framework.Interceptors " +
" " +
" aspect sample for [Socrates.Interfaces] " +
" " +
" pointcut method(* *(*))" +
" advice(CursorInterceptor)" +
" end" +
" " +
" end ";
* The 'CursorInterceptor'
[CLSCompliant(false)]
public object Invoke(IMethodInvocation invocation)
{
Cursor oudeCursor = Cursor.Current;
Cursor.Current = Cursors.WaitCursor;
object returnvalue = invocation.Proceed();
Cursor.Current = oudeCursor;
return returnvalue;
}
This actually works. I'm amazed. Wow. Because I'm forced to use the
WrapInterface method, I even get the added benefit of not having to make
my implemented methods virtual. This is _exacltly_ what I want!
However, I've stumbled upon a real problem: 'System.ArgumentException:
Cannot get TypeToken for a byref type.'
Investigation learns that this happens when wrapping an object target
(using WrapInterface) that inherits from a class which is indeed
marshalbyref. However, before encountering this problem I can happily
wrap a few other objects implementing exactly the same baseclass.
I'm not given the time to fully investigate this problem. Can someone
tell me if my approach should work and might work in time with newer
releases of aspect#?? (or should I jump out of the window, as was
suggested in your tutorial ;-))
Kind Regards,
Ruurd Boeke
ps. the exception:
1) Exception Information
*********************************************
Exception Type: System.ArgumentException
Message: Cannot get TypeToken for a byref type.
ParamName: NULL
TargetSite: System.Reflection.Emit.TypeToken GetTypeToken(System.Type)
HelpLink: NULL
Source: mscorlib
StackTrace Information
*********************************************
at System.Reflection.Emit.ModuleBuilder.GetTypeToken(Type type)
at System.Reflection.Emit.ILGenerator.Emit(OpCode opcode, Type cls)
at
Castle.DynamicProxy.Builder.CodeBuilder.SimpleAST.ConvertExpression.Emit(IEasyMember
member, ILGenerator gen)
at
Castle.DynamicProxy.Builder.CodeBuilder.SimpleAST.MethodInvocationExpression.Emit(IEasyMember
member, ILGenerator gen)
at
Castle.DynamicProxy.Builder.CodeBuilder.SimpleAST.ConvertExpression.Emit(IEasyMember
member, ILGenerator gen)
at
Castle.DynamicProxy.Builder.CodeBuilder.SimpleAST.ReturnStatement.Emit(IEasyMember
member, ILGenerator gen)
at
Castle.DynamicProxy.Builder.CodeBuilder.AbstractCodeBuilder.Generate(IEasyMember
member, ILGenerator il)
at Castle.DynamicProxy.Builder.CodeBuilder.EasyMethod.Generate()
at
Castle.DynamicProxy.Builder.CodeBuilder.AbstractEasyType.EnsureBuildersAreInAValidState()
at
Castle.DynamicProxy.Builder.CodeBuilder.AbstractEasyType.BuildType()
at
Castle.DynamicProxy.Builder.CodeBuilder.AbstractEasyType.BuildType()
at
Castle.DynamicProxy.Builder.CodeGenerators.BaseCodeGenerator.CreateType()
at
Castle.DynamicProxy.Builder.CodeGenerators.InterfaceProxyGenerator.GenerateCode(Type[]
interfaces)
at
Castle.DynamicProxy.Builder.DefaultProxyBuilder.CreateCustomInterfaceProxy(Type[]
interfaces, GeneratorContext context)
at Castle.DynamicProxy.ProxyGenerator.CreateCustomProxy(Type[]
interfaces, IInterceptor interceptor, Object target, GeneratorContext
context)
at Castle.DynamicProxy.ProxyGenerator.CreateCustomProxy(Type
theInterface, IInterceptor interceptor, Object target, GeneratorContext
context)
at AspectSharp.Core.CustomProxyGenerator.CreateProxy(Type inter,
Object target, Object[] mixins, IInterceptor interceptor) in
C:\Documents and Settings\szboekr\My Documents\Visual Studio
Projects\AspectSharp.src.2.1.0.0\src\AspectSharp\Core\DynamicProxy\CustomProxyGenerator.cs:line
51
at
AspectSharp.Core.Proxy.DefaultProxyFactory.ObtainInterfaceProxyInstance(AspectDefinition
aspect, Object target, Type inter, Object[] mixins,
IInvocationDispatcher dispatcher) in C:\Documents and
Settings\szboekr\My Documents\Visual Studio
Projects\AspectSharp.src.2.1.0.0\src\AspectSharp\Core\Proxy\DefaultProxyFactory.cs:line
133
at
AspectSharp.Core.Proxy.DefaultProxyFactory.CreateAndInstantiateInterfaceProxy(Type
inter, Object target, AspectDefinition aspect, IInvocationDispatcher
dispatcher) in C:\Documents and Settings\szboekr\My Documents\Visual
Studio
Projects\AspectSharp.src.2.1.0.0\src\AspectSharp\Core\Proxy\DefaultProxyFactory.cs:line
104
at
AspectSharp.Core.Proxy.DefaultProxyFactory.CreateInterfaceProxy(Type
inter, Object target, AspectDefinition aspect) in C:\Documents and
Settings\szboekr\My Documents\Visual Studio
Projects\AspectSharp.src.2.1.0.0\src\AspectSharp\Core\Proxy\DefaultProxyFactory.cs:line
83
at AspectSharp.AspectEngine.WrapInterface(Type inter, Object target)
in C:\Documents and Settings\szboekr\My Documents\Visual Studio
Projects\AspectSharp.src.2.1.0.0\src\AspectSharp\AspectEngine.cs:line
134
at Socrates.Client.Framework.ServerInterfaces.Get(Type
interfaceType) in
c:\socrates\code\socrates\client.framework\client.framework\communicatie\serverinterfaces.cs:line
134
--
De disclaimer van toepassing op e-mail van de Gemeente
Den Haag vindt u op Http://www.denhaag.nl/disclaimer
|
|
From: <hen...@gm...> - 2005-02-04 13:52:21
|
Hi Ruurd,
The problem is a method, with a a ByRef argument, in the proxied
class. DynamicProxy invokes the
System.Reflection.Emit.ModuleBuilder.GetTypeToken method when his
attempts to build the proxy. This method throws an ArgumentException
when the type is a ByRef .
We'll try to find a solution or a work around for this problem.
On Fri, 04 Feb 2005 13:25:13 +0100, Ruurd Boeke <SZ...@sz...> wr=
ote:
> Hi all,
>=20
> let me quickly introduce myself, since I'm new to this list. I'm Ruurd
> Boeke, freelance architect/developer in the Netherlands. At this moment
> I'm working on a (very) large project for the government.
> I've stumbled on Aspect# because of a request from my teamlead and
> reading about aspect oriented programming as used in nhibernate and
> blogs.
>=20
> Please excuse me, if the following question is not supposed to be asked
> on this mailing list. Your wiki is down ;-(
>=20
> We are already in the finishing stages of our project and will start
> deliviring within months. We have a server-client setup using remoting.
> I was challenged to build the following simple functionality: without
> changing the calls to the remote objects, implement a wait cursor while
> the client is waiting for the return value.
>=20
> (Keep in mind that I've just started using aspect# a few hours ago, so
> if my approach is very silly, please correct me without holding back!)
>=20
> I must say that I'm _very_ pleased with the ease that I could implement
> aspect# on this. I've taken the following steps:
> * In our framework where the remote object was activated with : object
> requestedInterface =3D Activator.GetObject(interfaceType, url.ToString())=
;
> I changed the call to: object requestedInterface =3D
> engine.WrapInterface(interfaceType, Activator.GetObject(interfaceType,
> url.ToString()));
>=20
> * The code to build the engine:
> String contents =3D " import Socrates.Client.Framework.Interceptors " +
> " " +
> " aspect sample for [Socrates.Interfaces] " +
> " " +
> " pointcut method(* *(*))" +
> " advice(CursorInterceptor)" +
> " end" +
> " " +
> " end ";
>=20
> * The 'CursorInterceptor'
> [CLSCompliant(false)]
> public object Invoke(IMethodInvocation invocation)
> {
> Cursor oudeCursor =3D Cursor.Current;
> Cursor.Current =3D Cursors.WaitCursor;
> object returnvalue =3D invocation.Proceed();
> Cursor.Current =3D oudeCursor;
>=20
> return returnvalue;
> }
>=20
> This actually works. I'm amazed. Wow. Because I'm forced to use the
> WrapInterface method, I even get the added benefit of not having to make
> my implemented methods virtual. This is _exacltly_ what I want!
>=20
> However, I've stumbled upon a real problem: 'System.ArgumentException:
> Cannot get TypeToken for a byref type.'
> Investigation learns that this happens when wrapping an object target
> (using WrapInterface) that inherits from a class which is indeed
> marshalbyref. However, before encountering this problem I can happily
> wrap a few other objects implementing exactly the same baseclass.
>=20
> I'm not given the time to fully investigate this problem. Can someone
> tell me if my approach should work and might work in time with newer
> releases of aspect#?? (or should I jump out of the window, as was
> suggested in your tutorial ;-))
>=20
> Kind Regards,
> Ruurd Boeke
>=20
> ps. the exception:
> 1) Exception Information
> *********************************************
> Exception Type: System.ArgumentException
> Message: Cannot get TypeToken for a byref type.
> ParamName: NULL
> TargetSite: System.Reflection.Emit.TypeToken GetTypeToken(System.Type)
> HelpLink: NULL
> Source: mscorlib
>=20
> StackTrace Information
> *********************************************
> at System.Reflection.Emit.ModuleBuilder.GetTypeToken(Type type)
> at System.Reflection.Emit.ILGenerator.Emit(OpCode opcode, Type cls)
> at
> Castle.DynamicProxy.Builder.CodeBuilder.SimpleAST.ConvertExpression.Emit(=
IEasyMember
> member, ILGenerator gen)
> at
> Castle.DynamicProxy.Builder.CodeBuilder.SimpleAST.MethodInvocationExpress=
ion.Emit(IEasyMember
> member, ILGenerator gen)
> at
> Castle.DynamicProxy.Builder.CodeBuilder.SimpleAST.ConvertExpression.Emit(=
IEasyMember
> member, ILGenerator gen)
> at
> Castle.DynamicProxy.Builder.CodeBuilder.SimpleAST.ReturnStatement.Emit(IE=
asyMember
> member, ILGenerator gen)
> at
> Castle.DynamicProxy.Builder.CodeBuilder.AbstractCodeBuilder.Generate(IEas=
yMember
> member, ILGenerator il)
> at Castle.DynamicProxy.Builder.CodeBuilder.EasyMethod.Generate()
> at
> Castle.DynamicProxy.Builder.CodeBuilder.AbstractEasyType.EnsureBuildersAr=
eInAValidState()
> at
> Castle.DynamicProxy.Builder.CodeBuilder.AbstractEasyType.BuildType()
> at
> Castle.DynamicProxy.Builder.CodeBuilder.AbstractEasyType.BuildType()
> at
> Castle.DynamicProxy.Builder.CodeGenerators.BaseCodeGenerator.CreateType()
> at
> Castle.DynamicProxy.Builder.CodeGenerators.InterfaceProxyGenerator.Genera=
teCode(Type[]
> interfaces)
> at
> Castle.DynamicProxy.Builder.DefaultProxyBuilder.CreateCustomInterfaceProx=
y(Type[]
> interfaces, GeneratorContext context)
> at Castle.DynamicProxy.ProxyGenerator.CreateCustomProxy(Type[]
> interfaces, IInterceptor interceptor, Object target, GeneratorContext
> context)
> at Castle.DynamicProxy.ProxyGenerator.CreateCustomProxy(Type
> theInterface, IInterceptor interceptor, Object target, GeneratorContext
> context)
> at AspectSharp.Core.CustomProxyGenerator.CreateProxy(Type inter,
> Object target, Object[] mixins, IInterceptor interceptor) in
> C:\Documents and Settings\szboekr\My Documents\Visual Studio
> Projects\AspectSharp.src.2.1.0.0\src\AspectSharp\Core\DynamicProxy\Custom=
ProxyGenerator.cs:line
> 51
> at
> AspectSharp.Core.Proxy.DefaultProxyFactory.ObtainInterfaceProxyInstance(A=
spectDefinition
> aspect, Object target, Type inter, Object[] mixins,
> IInvocationDispatcher dispatcher) in C:\Documents and
> Settings\szboekr\My Documents\Visual Studio
> Projects\AspectSharp.src.2.1.0.0\src\AspectSharp\Core\Proxy\DefaultProxyF=
actory.cs:line
> 133
> at
> AspectSharp.Core.Proxy.DefaultProxyFactory.CreateAndInstantiateInterfaceP=
roxy(Type
> inter, Object target, AspectDefinition aspect, IInvocationDispatcher
> dispatcher) in C:\Documents and Settings\szboekr\My Documents\Visual
> Studio
> Projects\AspectSharp.src.2.1.0.0\src\AspectSharp\Core\Proxy\DefaultProxyF=
actory.cs:line
> 104
> at
> AspectSharp.Core.Proxy.DefaultProxyFactory.CreateInterfaceProxy(Type
> inter, Object target, AspectDefinition aspect) in C:\Documents and
> Settings\szboekr\My Documents\Visual Studio
> Projects\AspectSharp.src.2.1.0.0\src\AspectSharp\Core\Proxy\DefaultProxyF=
actory.cs:line
> 83
> at AspectSharp.AspectEngine.WrapInterface(Type inter, Object target)
> in C:\Documents and Settings\szboekr\My Documents\Visual Studio
> Projects\AspectSharp.src.2.1.0.0\src\AspectSharp\AspectEngine.cs:line
> 134
> at Socrates.Client.Framework.ServerInterfaces.Get(Type
> interfaceType) in
> c:\socrates\code\socrates\client.framework\client.framework\communicatie\=
serverinterfaces.cs:line
> 134
>=20
> --
> De disclaimer van toepassing op e-mail van de Gemeente
> Den Haag vindt u op Http://www.denhaag.nl/disclaimer
>=20
> -------------------------------------------------------
> This SF.Net email is sponsored by: IntelliVIEW -- Interactive Reporting
> Tool for open source databases. Create drag-&-drop reports. Save time
> by over 75%! Publish reports on the web. Export to DOC, XLS, RTF, etc.
> Download a FREE copy at http://www.intelliview.com/go/osdn_nl
> _______________________________________________
> Aspectsharp-users mailing list
> Asp...@li...
> https://lists.sourceforge.net/lists/listinfo/aspectsharp-users
>=20
--=20
Cheers,
Henry Concei=E7=E3o
|
|
From: hammett <ha...@uo...> - 2005-02-04 14:50:24
|
Hello Ruurd, Maybe we can make DynamicProxy ignore methods from MarshalByRef, that would be the best approach. Handling ref and ret arguments is a nightmare Good lucky with your project! -- Cheers, hammett http://www.digitalcraftsmen.com.br/~hammett ----- Original Message ----- From: "Ruurd Boeke" <SZ...@sz...> > Hi all, > > let me quickly introduce myself, since I'm new to this list. I'm Ruurd > Boeke, freelance architect/developer in the Netherlands. At this moment > I'm working on a (very) large project for the government. |