Я попробовал очевидное:
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
.