A while ago I asked a similar question about how to get to methods inside
the engine from C#. This was the sample I got:

public delegate int IntIntDelegate(int arg);
engine.Execute("def IntIntMethod(a): return a * 100");

IntIntDelegate d = engine.Evaluate<IntIntDelegate>("IntIntMethod");

Console.WriteLine(d(2)); // This prints "200"

You can try to adapt this and see if it works for you. It looks a bit easier
this way.


-----Original Message-----
From: [EMAIL PROTECTED]
[mailto:[EMAIL PROTECTED] On Behalf Of Jason Ferrara
Sent: Saturday 12 August 2006 20:01
To: Discussion of IronPython
Subject: Re: [IronPython] Need help using IronPython from C#


On Aug 11, 2006, at 5:32 PM, Dino Viehland wrote:

> 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.
>


Ah. Thanks. This is what I needed.  So to make a C# wrapper for a  
Python class I should do something like...

     class LogViewerService
     {
         public delegate int GetNumberOfEntriesDelegate();
         public GetNumberOfEntriesDelegate GetNumberOfEntries;

         public delegate object GetEntryDelegate(int entryNumber);
         public GetEntryDelegate GetEntry;

         public delegate void closeDelegate();
         public closeDelegate close;

         public LogViewerService(object pythonObject)
         {
             object method;
             IronPython.Runtime.Operations.Ops.TryGetAttr 
(pythonObject, IronPython.Runtime.SymbolTable.StringToId 
("GetNumberOfEntries"), out method);
             GetNumberOfEntries = (GetNumberOfEntriesDelegate) 
IronPython.Runtime.Operations.Ops.GetDelegate(method, typeof 
(GetNumberOfEntriesDelegate));
             IronPython.Runtime.Operations.Ops.TryGetAttr 
(pythonObject, IronPython.Runtime.SymbolTable.StringToId("GetEntry"),  
out method);
             GetEntry = (GetEntryDelegate) 
IronPython.Runtime.Operations.Ops.GetDelegate(method, typeof 
(GetEntryDelegate));
             IronPython.Runtime.Operations.Ops.TryGetAttr 
(pythonObject, IronPython.Runtime.SymbolTable.StringToId("close"),  
out method);
             close = (closeDelegate) 
IronPython.Runtime.Operations.Ops.GetDelegate(method, typeof 
(closeDelegate));

         }

     }




_______________________________________________
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