Как разместить движок IronPython в отдельном домене приложений? - PullRequest
6 голосов
/ 01 сентября 2009

Я попробовал очевидное:

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

Но я получаю следующее сообщение об ошибке: Тип не разрешен для члена 'Microsoft.Scripting.Hosting.ScriptRuntimeSetup, Microsoft.Scripting, Версия = 0.9.0.0, Культура = нейтральный, PublicKeyToken = 31bf3856ad364e35'.

Поиск в Google по этой ошибке не оказался плодотворным, софар ...

РЕДАКТИРОВАТЬ # 1:

Я попытался создать минимальный проект воспроизведения, скопировав соответствующий материал в новое консольное приложение:

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();
        }
    }
}

Это работает как ожидалось!

Таким образом, мне остается сделать вывод, что ошибка, которую я получаю, связана с одной из закомментированных мной строк : область действия, добавленная в движок, содержит объект, над которым у меня мало контроля - ссылка на хост-плагин, в котором предполагается запускать это программное обеспечение (Autodesk Revit Architecture 2010).

Может быть, пытаясь передать это то, что создает ошибку?

Есть ли способ передать прокси вместо этого? (придется искать .NET remoting ...)

РЕДАКТИРОВАТЬ # 2:

Я урезал проблему до передачи объекта через область, которая не может быть передана другому домену приложения: все объекты, добавленные в область интерпретатора IronPython, работающего в другом домене приложения, должны будут каким-то образом маршализоваться и должны таким образом или продлите MarshalByRefObject или будьте Serializable.

1 Ответ

2 голосов
/ 19 декабря 2009

Просто создайте свой собственный класс начальной загрузки, который будет работать в новом домене приложений и будет выполнять инициализацию IronPyton там, это решит проблему?

...