[IronPython] .NET remoting with IronPython

Dino Viehland dinov at exchange.microsoft.com
Wed Sep 20 17:36:27 CEST 2006

This is a known issue - an easier work around is to create a typed proxy in Python that holds onto the instance & the interface type and does calls through the interface type passing the instance as the 1st parameter.  Bug 470 has the workaround code, http://www.codeplex.com/WorkItem/View.aspx?ProjectName=IronPython&WorkItemId=470, but it is:

class typedproxy(object):
      __slots__ = ['obj', 'proxyType']
      def __init__(self, obj, proxyType):
        self.proxyType = proxyType
        self.obj = obj
      def __getattribute__(self, attr):
        proxyType = object.__getattribute__(self, 'proxyType')
        obj = object.__getattribute__(self, 'obj')
        return getattr(proxyType, attr).__get__(obj, proxyType)

The issue here is that in .NET doing a cast of an MBR to an interface type always succeeds - and internally we're doing lots of casts against interfaces.

From: users-bounces at lists.ironpython.com [mailto:users-bounces at lists.ironpython.com] On Behalf Of Russell Lear
Sent: Wednesday, September 20, 2006 6:55 AM
To: users at lists.ironpython.com
Subject: [IronPython] .NET remoting with IronPython

I'm trying to access a service that uses .NET remoting using IronPython.  I have a C# interface, something like:

    interface IUserDB { ...
        MyUser GetUser(string id);

I've tried to get a remoted instance of that interface using the following python:
    t = a.GetType("IUserDB")   # This works
    db = System.Runtime.Remoting.RemotingServices.Connect(t, dbServerURL)

But if I try to do anything with db, I get:
SystemError: Type 'IronPython.Runtime.ModuleScope' in Assembly 'IronPython, Version=1.0.60816.1877, Culture=neutral,
PublicKeyToken=31bf3856ad364e35' is not marked as serializable.

I get the same error if I instantiate the remoted object in C# and then try to do anything with it in Python.  My work around is to create a proxy that wraps the remote object in a class that implements IUserDB by passing the calls directly to the wrapped remote object.  Works, but a little ugly.  Any thoughts?


More information about the Ironpython-users mailing list