[IronPython] [python] IP 2.0 Alpha 7 embedding
Slide
slide.o.mix at gmail.com
Sun Dec 23 22:07:33 CET 2007
I don't mind at all, I just hope that is the way it is supposed to be done :)
Thanks,
slide
On Dec 23, 2007 11:08 AM, Michael Foord <fuzzyman at voidspace.org.uk> wrote:
> Hello Slide,
>
> If you don't mind I will post this example to the IronPython Cookbook!
>
> Thanks
>
> Michael
>
>
> Slide wrote:
> > I have come up with an example (very simple) of embedding IP 2.0 into
> > a C# app and doing back and forth handling of objects (objects
> > declared in Python and object declared in C#). I am interested to know
> > if I am doing some things the best way as I've just been going kind of
> > hit and miss. Can someone do a little critiquing of this code and see
> > if I am being dumb? The windows app has two RichTextBoxes on it (one
> > for input, the other for output), a clear button and a "go" button.
> > When the "go" button is pressed, it writes the source out to a temp
> > file and then creates the object instance from the script. Thanks!
> >
> >
> > Here is the code:
> >
> >
> > test.py
> > ============================================
> > import TestLib, unittest
> >
> > def Print(message):
> > output.AppendText("%s\r\n" % message)
> >
> > class Test(TestLib.ITest):
> > def Print(self, message):
> > output.AppendText("%s\r\n" % message)
> >
> > Print("Hello, world!")
> >
> >
> >
> >
> > ITestLib.cs located in TestLib.dll
> > ==========================================
> > using System;
> > using System.Collections.Generic;
> > using System.Text;
> >
> > namespace TestLib
> > {
> > public interface ITest
> > {
> > void Print(string message);
> > }
> > }
> >
> >
> >
> > MainForm.cs located in IPEmbed.exe which references TestLib.dll
> > ============================================
> > using System;
> > using System.Collections.Generic;
> > using System.ComponentModel;
> > using System.Data;
> > using System.Drawing;
> > using System.Text;
> > using System.IO;
> > using System.Windows.Forms;
> >
> > using Microsoft.Scripting;
> > using Microsoft.Scripting.Hosting;
> >
> > using IronPython.Runtime;
> > using IronPython.Hosting;
> >
> > namespace IPEmbed
> > {
> > public partial class Form1 : Form
> > {
> > private ScriptScope __main__;
> > private LanguageContext _context;
> >
> > public Form1()
> > {
> > InitializeComponent();
> >
> > _context = LanguageContext.FromEngine(PythonEngine.CurrentEngine);
> > _context.SetScriptSourceSearchPaths(new string[] {
> > Environment.CurrentDirectory,
> > Path.Combine(Environment.CurrentDirectory, "Lib") });
> > }
> >
> > // sets up the script engine, etc
> > private void go_Click(object sender, EventArgs e)
> > {
> > ScriptDomainManager.CurrentManager.Host.DefaultModule.ClearVariables();
> >
> > if (input.Text.Length == 0)
> > return;
> >
> > string filepath = Path.GetTempFileName();
> > File.WriteAllText(filepath, input.Text);
> >
> > __main__ =
> > ScriptDomainManager.CurrentManager.CompileModule("__main__",
> > SourceUnit.CreateFileUnit(_context, filepath));
> > ScriptDomainManager.CurrentManager.PublishModule(__main__,
> > "__main__");
> >
> > Microsoft.Scripting.ClrModule.GetInstance().AddReference("TestLib");
> > __main__.SetVariable("output", output);
> > __main__.Execute();
> >
> > TestLib.ITest test = CreateInstanceFromInterface<TestLib.ITest>();
> > if (test != null)
> > test.Print("Hello, world!");
> > }
> >
> > // this method will find a class in the python code that
> > implements a given interface and create and instance
> > // of that class, returning it as the interface
> > private T CreateInstanceFromInterface<T>()
> > {
> > T result = default(T);
> >
> > IAttributesCollection attrs =
> > IronPython.Runtime.Types.PythonModuleOps.Get__dict__(__main__);
> > foreach (KeyValuePair<object, object> attr in attrs)
> > {
> > IronPython.Runtime.Types.PythonType attr_type =
> > attr.Value as IronPython.Runtime.Types.PythonType;
> >
> > if (attr_type != null)
> > {
> > foreach (IronPython.Runtime.Types.PythonType dt in
> > attr_type.BaseTypes)
> > {
> > if (dt.UnderlyingSystemType != null &&
> > dt.UnderlyingSystemType == typeof(T))
> > {
> > CodeContext context = new
> > CodeContext(__main__.Scope, _context, new ModuleContext(__main__));
> > result = (T)attr_type.CreateInstance(context);
> > break;
> > }
> > }
> > }
> > }
> > return result;
> > }
> >
> > private void clear_Click(object sender, EventArgs e)
> > {
> > output.Clear();
> > }
> > }
> > }
> > _______________________________________________
> > 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