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: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] 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: [EMAIL PROTECTED] [mailto:users-
> [EMAIL PROTECTED] 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@lists.ironpython.com
> http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
> _______________________________________________
> users mailing list
> users@lists.ironpython.com
> http://lists.ironpython.com/listinfo.cgi/users-ironpython.com

_______________________________________________
users mailing list
users@lists.ironpython.com
http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
_______________________________________________
users mailing list
users@lists.ironpython.com
http://lists.ironpython.com/listinfo.cgi/users-ironpython.com

Reply via email to