[IronPython] Remoting broken in 2.0?

Marc Saegesser marc at saegesser.org
Thu Jan 22 03:46:50 CET 2009


Excellent!  That did the trick.

Marc



On Wed, Jan 21, 2009 at 8:33 PM, Dino Viehland <dinov at microsoft.com> wrote:
> I discovered System.Runtime.Remoting.RemotingServices.IsTransparentProxy(), it might be better to call that on argValue instead of doing the interface check.
>
> if (System.Runtime.Remoting.RemotingServices.IsTransparentProxy(argValue)) {
>        return new ParameterMetaObject(parameterExpression, argValue);
> }
>
>> -----Original Message-----
>> From: users-bounces at lists.ironpython.com [mailto:users-
>> bounces at lists.ironpython.com] On Behalf Of Dino Viehland
>> Sent: Wednesday, January 21, 2009 6:21 PM
>> To: Discussion of IronPython
>> Subject: Re: [IronPython] Remoting broken in 2.0?
>>
>> I believe I have a solution but I don't know if it's ideal, if it'll
>> break other things, or if there are also other spots that need to be
>> updated..  I'll need to talk to the DLR team about it and hopefully
>> they can figure those things out :).  But if you're willing to compile
>> from source you can download the IronPython 2 source code and edit
>> MetaObject.cs.  The changes are easy, just add:
>>
>>         interface IRemotingMarker {
>>         }
>>
>> In the MetaObject class definition.  Then add:
>>
>>             IRemotingMarker irm = argValue as IRemotingMarker;
>>             if(irm != null) {
>>                 // remote object, don't check for other interfaces.
>>                 return new ParameterMetaObject(parameterExpression,
>> argValue);
>>             }
>>
>> At the beginning of ObjectToMetaObject.
>>
>> That'll detect remote objects and avoid going down the failing code
>> path.  I'll ping the DLR team now and get the issue on a future DLR
>> design discussion.  If this does turn out to be the right solution (or
>> close to it) we can fix this in 2.0.1.  Thanks for the report!
>>
>> > -----Original Message-----
>> > From: users-bounces at lists.ironpython.com [mailto:users-
>> > bounces at lists.ironpython.com] On Behalf Of Marc Saegesser
>> > Sent: Wednesday, January 21, 2009 5:21 PM
>> > To: Discussion of IronPython
>> > Subject: Re: [IronPython] Remoting broken in 2.0?
>> >
>> > Type 'Microsoft.Linq.Expressions.ParameterExpression' in Assembly
>> > 'Microsoft.Scripting.Core, Version=0.9.0.0, Culture=neutral,
>> > PublicKeyToken=31bf3856ad364e35' is not marked as serializable.
>> >
>> > Server stack trace:
>> >    at
>> >
>> System.Runtime.Serialization.FormatterServices.InternalGetSerializableM
>> > embers(RuntimeType
>> > type)
>> >    at
>> >
>> System.Runtime.Serialization.FormatterServices.GetSerializableMembers(T
>> > ype
>> > type, StreamingContext context)
>> >    at
>> >
>> System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitMemb
>> > erInfo()
>> >    at
>> >
>> System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitSeri
>> > alize(Object
>> > obj, ISurrogateSelector surrogateSelector, StreamingContext context,
>> > SerObjectInfoInit serObjectInfoInit, IFor
>> > matterConverter converter, ObjectWriter objectWriter)
>> >    at
>> >
>> System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.Serializ
>> > e(Object
>> > obj, ISurrogateSelector surrogateSelector, StreamingContext context,
>> > SerObjectInfoInit serObjectInfoInit, IFormatt
>> > erConverter converter, ObjectWriter objectWriter)
>> >    at
>> >
>> System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Serialize(O
>> > bject
>> > graph, Header[] inHeaders, __BinaryWriter serWriter, Boolean fCheck)
>> >    at
>> >
>> System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serializ
>> > e(Stream
>> > serializationStream, Object graph, Header[] headers, Boolean fCheck)
>> >    at
>> >
>> System.Runtime.Remoting.Channels.BinaryClientFormatterSink.SerializeMes
>> > sage(IMessage
>> > msg, ITransportHeaders& headers, Stream& stream)
>> >    at
>> >
>> System.Runtime.Remoting.Channels.BinaryClientFormatterSink.SyncProcessM
>> > essage(IMessage
>> > msg)
>> >
>> > Exception rethrown at [0]:
>> >    at
>> >
>> System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage
>> > reqMsg, IMessage retMsg)
>> >    at
>> > System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData&
>> > msgData, Int32 type)
>> >    at
>> > Microsoft.Scripting.Actions.IDynamicObject.GetMetaObject(Expression
>> > parameter)
>> >    at
>> Microsoft.Scripting.Actions.MetaObject.ObjectToMetaObject(Object
>> > argValue, Expression parameterExpression)
>> >    at Microsoft.Scripting.Actions.MetaAction.Bind[T](Object[] args)
>> >    at Microsoft.Scripting.Actions.CallSite`1.CreateNewRule(Rule`1
>> > originalMonomorphicRule, Object[] args)
>> >    at
>> Microsoft.Scripting.Actions.CallSite`1.UpdateAndExecute(Object[]
>> > args)
>> >    at
>> >
>> Microsoft.Scripting.Actions.UpdateDelegates.Update4[T,T0,T1,T2,T3,TRet]
>> > (CallSite
>> > site, T0 arg0, T1 arg1, T2 arg2, T3 arg3)
>> >    at S$2.Initialize$17()
>> >    at _stub_$226##76(Closure , CallSite , CodeContext , Object )
>> >    at
>> Microsoft.Scripting.Actions.MatchCaller.Call2[T0,T1,TRet](Func`4
>> > target, CallSite site, Object[] args)
>> >    at
>> Microsoft.Scripting.Actions.CallSite`1.UpdateAndExecute(Object[]
>> > args)
>> >    at
>> >
>> Microsoft.Scripting.Actions.UpdateDelegates.Update2[T,T0,T1,TRet](CallS
>> > ite
>> > site, T0 arg0, T1 arg1)
>> >    at <module>$224##74(Closure , Scope , LanguageContext )
>> >    at
>> >
>> Microsoft.Scripting.Runtime.OptimizedScriptCode.InvokeTarget(LambdaExpr
>> > ession
>> > code, Scope scope)
>> >    at Microsoft.Scripting.ScriptCode.Run(Scope scope)
>> >    at
>> >
>> IronPython.Hosting.PythonCommandLine.<>c__DisplayClass1.<RunOneInteract
>> > ion>b__0()
>> > SystemError: Type 'Microsoft.Linq.Expressions.ParameterExpression' in
>> > Assembly 'Microsoft.Scripting.Core, Version=0.9.0.0, Culture=neutral,
>> > PublicKeyToken=31bf3856ad364e35' is not marked as serializab
>> > le.
>> > Marc
>> >
>> >
>> >
>> > On Wed, Jan 21, 2009 at 5:57 PM, Dino Viehland <dinov at microsoft.com>
>> > wrote:
>> > > Can you run w/ -X:ExceptionDetail to get the full stack trace?
>> > >
>> > > It's presumably trying to serialize it for a call to IDynamicObject
>> > which has a GetMetaObject(Expression e) method on it.
>> > >
>> > > -----Original Message-----
>> > > From: users-bounces at lists.ironpython.com [mailto:users-
>> > bounces at lists.ironpython.com] On Behalf Of Marc Saegesser
>> > > Sent: Wednesday, January 21, 2009 3:46 PM
>> > > To: Discussion of IronPython
>> > > Subject: Re: [IronPython] Remoting broken in 2.0?
>> > >
>> > > I was already using the typedproxy stuff in my code running under
>> > > 2.0b3 and my code looks just like the sample code you showed.  It
>> > > works great in 2.0b3, but throws an exception in 2.0.
>> > >
>> > > The class it's complaining about, ParameterExpression, really isn't
>> > > serializable according to the documentation.  So the question is
>> why
>> > > is 2.0 trying to serialize a ParameterExpression when 2.0b3 wasn't?
>> > > My remote object doesn't do anything with Linq or expressions so
>> I'm
>> > > not sure where it's coming from.
>> > >
>> > >
>> > > Marc
>> > >
>> > >
>> > >
>> > > On Wed, Jan 21, 2009 at 5:27 PM, Dino Viehland
>> <dinov at microsoft.com>
>> > wrote:
>> > >> This is related to 470 but is slightly different.  But in both
>> cases
>> > the CLR is lying to us and telling us your object does implement the
>> > interface but it really doesn't (or I'm assuming that's the case,
>> maybe
>> > whatever you're doing Activator.CreateInstance does implement the
>> > interface).  But now we're blowing up before the interface cast on
>> the
>> > remote side because Expression trees aren't serializable (whereas
>> > before we were blowing up on the other side of the remote call
>> because
>> > the remote object doesn't actually implement the interface).
>> > >>
>> > >> The workaround at the bottom of that bug should work for you.  You
>> > can create a local "typed proxy" object which goes through the type
>> > object to get members instead of the instance.  That should avoid the
>> > interface check and you should be able to talk to the remote object.
>> > For convenience here's the typed proxy object:
>> > >>
>> > >> class typedproxy(object):
>> > >>    __slots__ = ['obj', 'proxyType']
>> > >>    def __init__(self, obj, proxyType):
>> > >>        self.obj = obj
>> > >>        self.proxyType = proxyType
>> > >>
>> > >>    def __getattribute__(self, attr):
>> > >>        proxyType = object.__getattribute__(self, 'proxyType')
>> > >>        obj = object.__getattribute__(self, 'obj')
>> > >>        return getattr(proxyType, attr).__get__(obj, proxyType)
>> > >>
>> > >>
>> > >>
>> > >> test = typedproxy(System.Activator.GetObject(RemoteTest,
>> > 'http://localhost:8000/RemoteTest'), RemoteTest)
>> > >>
>> > >>
>> > >> If that doesn't work let us know.
>> > >>
>> > >>
>> > >>
>> > >> -----Original Message-----
>> > >> From: users-bounces at lists.ironpython.com [mailto:users-
>> > bounces at lists.ironpython.com] On Behalf Of Marc Saegesser
>> > >> Sent: Wednesday, January 21, 2009 2:40 PM
>> > >> To: users
>> > >> Subject: [IronPython] Remoting broken in 2.0?
>> > >>
>> > >> I've been using 2.0b3 for quite some time with good results.  I
>> just
>> > >> tried to move to the final 2.0 release and ran into a fatal
>> problem.
>> > >> I use .Net Remoting and when I try to create a proxy to a well
>> known
>> > >> object using System.Activator.GetObject() I get the following
>> error:
>> > >>
>> > >> SystemError: Type 'Microsoft.Linq.Expressions.ParameterExpression'
>> > in
>> > >> Assembly 'Microsoft.Scripting.Core, Version=0.9.0.0,
>> > Culture=neutral,
>> > >> PublicKeyToken=31bf3856ad364e35' is not marked as serializable.
>> > >>
>> > >> The only change was going from 2.0b3 to 2.0.
>> > >>
>> > >> I think this is the same problem reported in item 470
>> > >>
>> >
>> (http://www.codeplex.com/IronPython/WorkItem/View.aspx?WorkItemId=470)
>> > >> in June of 2006.
>> > >>
>> > >> Any ideas on how to get around the problem?
>> > >>
>> > >> Marc
>> > >> _______________________________________________
>> > >> Users mailing list
>> > >> Users at lists.ironpython.com
>> > >> http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
>> > >> _______________________________________________
>> > >> Users mailing list
>> > >> Users at lists.ironpython.com
>> > >> http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
>> > >>
>> > > _______________________________________________
>> > > Users mailing list
>> > > Users at lists.ironpython.com
>> > > http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
>> > > _______________________________________________
>> > > Users mailing list
>> > > Users at lists.ironpython.com
>> > > http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
>> > >
>> > _______________________________________________
>> > Users mailing list
>> > Users at lists.ironpython.com
>> > http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
>> _______________________________________________
>> Users mailing list
>> Users at lists.ironpython.com
>> http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
> _______________________________________________
> Users mailing list
> Users at lists.ironpython.com
> http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
>



More information about the Ironpython-users mailing list