Вопрос по c#, ironpython, appdomain, .net – Как разместить движок IronPython в отдельном домене приложений?

6

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

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 '.

Погуглить на эту ошибку не оказалось плодотворным софар ...

РЕДАКТИРОВАНИЕ № 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

Я хотел бы предположить, что это потоки, которые вы создаете в этом домене приложения, но пусть машина работает в другом домене приложения ... cRichter
Можете ли вы предоставить больше информации о том, как выперекомпилировать / запустить это? Это работает для меня против 2.0.2 и 2.6 Beta 2, когда я ставлю "test.cs» в каталоге Program Files и запустите его. Также вы работаете с .NET 2.0 / 3.0 / 3.5 или .NET 4? Dino Viehland

Ваш Ответ

1   ответ
2

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

Я смог свести проблему к чему-то другому - объектам, которые я хотел передать во время выполнения IronPython, где не MarshalByRef, и в этом была проблема ... Daren Thomas

Похожие вопросы