[IronPython] Using IronPython as an assembly in dotNET

Dino Viehland dinov at microsoft.com
Thu Aug 13 10:58:32 PDT 2009


There's documentation on the hosting APIs over here:

http://dlr.codeplex.com/Wiki/View.aspx?title=Docs%20and%20specs

But basically you want to do:

scope = engine.CreateScope()
scope.SetVariable("my_object_model", new MyObjectModel())
engine.Execute("print my_object_model.SomeCall()", scope)

As a workaround for Execute you can call ExecuteAndWrap which
doesn't have a generic overload.  You'll just need to call
.Unwrap() on the resulting value to get the real object back.

A quick search seems to indicate that MaxScript 9 doesn't
support generics.  I have no clue what the latest version is
though so I'm not sure how relevant that was (it was from 2006).

> -----Original Message-----
> From: users-bounces at lists.ironpython.com [mailto:users-
> bounces at lists.ironpython.com] On Behalf Of Lukas Dubeda
> Sent: Thursday, August 13, 2009 10:42 AM
> To: Discussion of IronPython
> Subject: Re: [IronPython] Using IronPython as an assembly in dotNET
>
> Hey, thanks Dino,
>
> some interesting points. However, I'm not a programmer, I'm more of a
> "scripter" so all I'm familiar with is Python and MAXScript (native 3ds
> Max scripting language).
>
> I have no idea how to access the generic/non-generic engine, further
> more, I have no idea what the difference is.
>
> As for scope, I can do that, the problem is, I have no idea how exactly
> to do that. Is there a documentation on this subject somewhere?
>
> Thanks a lot for the tips, I appretiate it.
>
> - Lukas
>
> Dino Viehland wrote:
> > What language are you doing this from?
> >
> > ScriptEngine.Execute has an overload which is generic and an overload
> > which is not generic.  The generic version will get the result and
> > convert it to the provided generic type.  It looks like for some
> reason
> > you end up trying to call the generic version here.  Does the
> language
> > have support for generics?  If so you could do:
> >
> > engine.Execute<object>(...) (C# syntax)
> >
> > which would be the same as the non-generic version.
> >
> > For communication I'd suggest injecting a class into the ScriptScope
> > You execute the code in.  Then the Python code can call back on it or
> > subscribe to events on it.
> >
> >
> >> -----Original Message-----
> >> From: users-bounces at lists.ironpython.com [mailto:users-
> >> bounces at lists.ironpython.com] On Behalf Of Lukas Dubeda
> >> Sent: Thursday, August 13, 2009 10:15 AM
> >> To: users at lists.ironpython.com
> >> Subject: [IronPython] Using IronPython as an assembly in dotNET
> >>
> >> Hi there everyone,
> >>
> >> I have a problem I can't seem to figure out.
> >>
> >> I want to use IronPython as an assembly via dotNET, I managed to
> load
> >> it
> >> as an assembly and access various constructors, classes etc...
> >>
> >> However, I have a problem with executing Python code from the host
> >> application. I'm using 3ds Max to load up the assembly via dotNET.
> The
> >> code looks like this:
> >>
> >> Assembly = dotNetClass "System.Reflection.Assembly" -- loading the
> >> assembly class
> >> Assembly.LoadFrom "C:\IronPython-2.0.1\IronPython.dll" -- loading
> >> IronPython
> >>
> >> ironPythonHosting = dotNetClass "IronPython.Hosting.Python" --
> loading
> >> the hosting class
> >> pythonEngine = ironPythonHosting.CreateEngine() -- creating an
> engine
> >>
> >> Now, when I execute:
> >>
> >> pythonEngine.ExecuteFile("C:\\tst.py")
> >>
> >> it runs smoothly and executes the tst.py and whatever Python code
> >> that's
> >> inside.
> >>
> >> Now, I want to execute the code directly, not via a saved file. I
> tried
> >> this:
> >>
> >> pythonEngine.Execute("print 'TEST'")
> >>
> >> but it throws me an error:
> >>
> >> -- Error occurred in anonymous codeblock; filename: ; position: 344
> >> -- Runtime error: dotNet runtime exception: Late bound operations
> >> cannot
> >> be performed on types or methods for which ContainsGenericParameters
> is
> >> true.
> >>
> >> Also, if I execute the Python code inside a file, is there a way to
> get
> >> the result/feedback from the code back to the host application? Via
> >> dotNET or IronPython? Or anyhow? So that I can write more complex
> tools
> >> that'd communicate with Pyhon code from within 3ds Max.
> >>
> >> Thanks a lot in advance, cheers,
> >>
> >> - Lukas Dubeda
> >> _______________________________________________
> >> 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
> >
> > __________ Information from ESET NOD32 Antivirus, version of virus
> signature database 4332 (20090813) __________
> >
> > The message was checked by ESET NOD32 Antivirus.
> >
> > http://www.eset.com
> >
> >
> >
> >
> _______________________________________________
> Users mailing list
> Users at lists.ironpython.com
> http://lists.ironpython.com/listinfo.cgi/users-ironpython.com


More information about the Users mailing list