J'ai essayé l'évidence:Comment héberger un moteur IronPython dans un AppDomain distinct?
var appDomain = AppDomain.CreateDomain("New Domain");
var engine = IronPython.Hosting.Python.CreateEngine(appDomain); // boom!
Mais je reçois le message d'erreur suivant: Type n'est pas résolu pour les membres « Microsoft.Scripting.Hosting.ScriptRuntimeSetup, Microsoft.Scripting, Version = 0.9.0.0, Culture = neutre, PublicKeyToken = 31bf3856ad364e35 '.
recherche sur Google pour cette erreur n'a pas été fructueuse sofar ...
EDIT # 1:
j'ai essayé de créer un projet de reproduction minimal en copiant les choses pertinentes à une nouvelle application de console:
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();
}
}
}
Cela fonctionne comme prévu!
Je suis donc parti pour conclure que l'erreur que je reçois est liée à l'une des lignes j'ai commenté: La portée ajoutée au moteur contient un objet sur lequel j'ai peu de contrôle - une référence à un hôte plugin Ce logiciel est destiné à fonctionner (Autodesk Revit Architecture 2010).
Peut-être essayer de passer cela est ce qui crée l'erreur?
Existe-t-il un moyen de passer un proxy à la place? (Devra rechercher .NET Remoting ...)
EDIT # 2:
J'amenuisé le problème à passer un objet via le champ qui ne peut être à l'autre proxy AppDomain: Tous les objets ajoutés à la portée d'un interpréteur IronPython s'exécutant dans un AppDomain différent devront être marshalés d'une manière ou d'une autre et doivent donc soit étendre MarshalByRefObject
, soit être Serializable
.
Pouvez-vous fournir plus d'informations sur la façon dont vous compilez/exécutez ceci? Cela fonctionne pour moi contre 2.0.2 et 2.6 Bêta 2 quand je mets "test.cs" dans le répertoire Program Files et l'exécute. Aussi courez-vous contre .NET 2.0/3.0/3.5 ou .NET 4? –
Je dirais que ce sont les flux, que vous créez dans ce domaine d'application, mais laissez la machine tourner dans un autre domaine d'application ... – cRichter