views:

431

answers:

1

I have tried the obvious:

var appDomain = AppDomain.CreateDomain("New Domain");
var engine = IronPython.Hosting.Python.CreateEngine(appDomain); // boom!

But I am getting the following error message: Type is not resolved for member 'Microsoft.Scripting.Hosting.ScriptRuntimeSetup,Microsoft.Scripting, Version=0.9.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'.

Googling for this error has not proved fruitful sofar...

EDIT #1:

I tried to create a minimal reproducing project by copying the relevant stuff to a new Console Application:

using System;
using Microsoft.Scripting;

namespace PythonHostSamle
{
    class Program
    {
        static void Main(string[] args)
        {
            AppDomain sandbox = AppDomain.CreateDomain("sandbox");
            var engine = IronPython.Hosting.Python.CreateEngine(sandbox);
            var searchPaths = engine.GetSearchPaths();
            searchPaths.Add(@"C:\Python25\Lib");
            searchPaths.Add(@"C:\RevitPythonShell");
            engine.SetSearchPaths(searchPaths);
            var scope = engine.CreateScope();
            //scope.SetVariable("revit", _application);
            //engine.Runtime.IO.SetOutput(new ScriptOutputStream(_instance),     Encoding.UTF8);
            //engine.Runtime.IO.SetErrorOutput(new ScriptOutputStream(_instance),     Encoding.UTF8);
            var script = engine.CreateScriptSourceFromString("print 'hello, world!'",     SourceCodeKind.Statements);
            script.Execute(scope);

            Console.ReadKey();
        }
    }
}

This works as expected!

I am thus left to conclude that the error I am getting is related to one of the lines I commented out: The scope added to the engine contains an object I have little control over - a reference to a plugin host this software is intended to run in (Autodesk Revit Architecture 2010).

Maybe trying to pass that is what is creating the error?

Is there a way to pass a proxy instead? (will have to look up .NET remoting...)

EDIT #2:

I have whittled the problem down to passing an object via the scope that does cannot be proxied to the other AppDomain: All objects added to the scope of an IronPython interpreter running in a different AppDomain will have to be marshaled somehow and must thus either extend MarshalByRefObject or be Serializable.

+1  A: 

Just create your own bootstrapping class that will run in a new AppDomain and will do the initialization of IronPyton there, will it solve the prob?

koltun
I was able to reduce the problem to something else - the objects I wanted to pass into the IronPython runtime where not MarshalByRef and that was the problem...
Daren Thomas