2009-09-01 14 views
6

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.

+0

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? –

+0

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

Répondre

2

Il suffit de créer votre propre classe d'amorçage qui s'exécutera dans un nouvel AppDomain et y fera l'initialisation de IronPyton, cela résoudra-t-il le problème?

+0

J'ai été capable de réduire le problème à autre chose - les objets que je voulais transmettre le runtime IronPython où pas MarshalByRef et c'était le problème ... –

Questions connexes