[IronPython] Need help using IronPython from C#

Dino Viehland dinov at exchange.microsoft.com
Fri Aug 11 23:32:32 CEST 2006


You're quickly getting into the guts of the runtime, so you'll find most of what you want over in Ops.

To get an attribute off of an object you can do TryGetAttr(object o, SymbolId name, out object ret).  o would be your ls, SymbolId's our what we use internally to represent attributes - you can get one by doing SymbolTable.SymbolToId("foo"), and then we'll pass you out the value.

As you get the values back you'd need to re-create delegates to them.  Note if you're re-creating delegates of the same type we won't need to do any additional code gen work - we'll just bind the new object back to the existing method we created, so this shouldn't be too nasty to do.  If you're getting a property we'll return the property value from Ops.GetAttr (basically if you hit a descriptor we will run the descriptor code for you).  And if you're getting some plain old attribute back out then you can do whatever you want w/ the value from there.

-----Original Message-----
From: users-bounces at lists.ironpython.com [mailto:users-bounces at lists.ironpython.com] On Behalf Of Jason Ferrara
Sent: Friday, August 11, 2006 1:29 PM
To: Discussion of IronPython
Subject: Re: [IronPython] Need help using IronPython from C#


On Aug 11, 2006, at 3:53 PM, Dino Viehland wrote:
>
>
> If you really do want to get a delegate to a Python function that came
> from a module you might want to look at Ops.GetDelegate.  If you were
> to create a module, execute its contents, and then get the method back
> out by name as an object you could pass the method to Ops.GetDelegate
> w/ a delegate type and create a delegate to the raw Python method that
> you could call from C#.

I think this is closer to what I want. I'm looking for clean way to expose an API written in Python to a C# program.

So I can do

MyDelegate ConnectToService = (MyDelegate) IronPython.Runtime.Operations.Ops.GetDelegate(e.Evaluate
("RemoteAdmin.ConnectToService"), typeof(MyDelegate));

and then...

object ls = ConnectToService("localhost","LogViewer");

but now how do I get to the methods and attributes of ls?


>
> -----Original Message-----
> From: users-bounces at lists.ironpython.com [mailto:users-
> bounces at lists.ironpython.com] On Behalf Of Jason Ferrara
> Sent: Friday, August 11, 2006 12:08 PM
> To: Discussion of IronPython
> Subject: [IronPython] Need help using IronPython from C#
>
> I'd like to do the equivalent of something like...
>
> import RemoteAdmin
>
> ls = RemoteAdmin.ConnectToService("localhost","LogViewer")
> numEntries = ls.GetNumberOfEntries()
> e = ls.GetEntry(numEntries - 1)
> entryString = str(e)
>
>
> in C#.
>
> So I get as far as....
>
> PythonEngine e = new PythonEngine();
> # The RemoteAdmin module is in an assembly built using
> IronPython.Hosting.Compiler and then referenced by the C# project
> ClrModule clr = (ClrModule) e.Import("clr");
> clr.AddReference(typeof(RemoteAdmin).Assembly)
> e.Import("RemoteAdmin");
>
> and then I'm lost.
>
> Is there a way to make a delegate from a method that exists in the
> PythonEngine environment and then call the delegate from C#?
>
> I'm aware of the Evaluate and Execute methods of PythonEngine, but I'm
> looking for a more direct way to call the python methods and access
> python object attributes, rather than building up strings to pass to
> Evaluate.
>
> Thanks
>
> - Jason
>
>
> _______________________________________________
> 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