2009-09-01 12 views
6

मैंने स्पष्ट करने की कोशिश की है:एक अलग ऐपडोमेन में आयरनपीथन इंजन की मेजबानी कैसे करें?

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

लेकिन मुझे निम्न त्रुटि संदेश मिल रहा है: प्रकार को सदस्य 'माइक्रोसॉफ्ट.स्क्रिप्टिंग.होस्टिंग.स्क्रिप्टरटाइमसेटअप, माइक्रोसॉफ्ट.स्क्रिप्टिंग, संस्करण = 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 आर्किटेक्चर 2010) में चलाने का इरादा है।

शायद यह पास करने की कोशिश कर रहा है कि त्रुटि क्या है?

इसके बजाय प्रॉक्सी पास करने का कोई तरीका है? (.NET remoting को देखना होगा ...)

EDIT # 2:

मैंने किसी ऑब्जेक्ट को उस दायरे के माध्यम से पारित करने के लिए समस्या को दबा दिया है जिसे अन्य ऐपडोमेन से प्रॉक्सी नहीं किया जा सकता है: एक अलग ऐपडोमेन में चल रहे आयरनपीथन दुभाषिया के दायरे में जोड़े गए सभी ऑब्जेक्ट्स को किसी भी तरह से मार्शल किया जाना चाहिए और इस प्रकार या तो MarshalByRefObject का विस्तार करना चाहिए या Serializable होना चाहिए।

+0

क्या आप इस बारे में अधिक जानकारी प्रदान कर सकते हैं कि आप इसे कैसे संकलित/चला रहे हैं? यह 2.0.2 और 2.6 बीटा 2 के खिलाफ मेरे लिए काम करता है जब मैं प्रोग्राम फाइल निर्देशिका में "test.cs" डालता हूं और इसे चलाता हूं। क्या आप .NET 2.0/3.0/3.5 या .NET 4 के विरुद्ध भी चल रहे हैं? –

+0

मैं सुझाव दूंगा कि यह स्ट्रीम है, जिसे आप इस ऐप डोमेन में बनाते हैं, लेकिन मशीन को किसी अन्य ऐप डोमेन में चलने दें ... – cRichter

उत्तर

2

बस अपनी खुद की बूटस्ट्रैपिंग क्लास बनाएं जो एक नए ऐपडोमेन में चलेगी और वहां आयरनपीटन की शुरुआत होगी, क्या यह प्रोब को हल करेगा?

+0

मैं किसी अन्य चीज़ को समस्या को कम करने में सक्षम था - जिन वस्तुओं को मैं पास करना चाहता था आयरनपीथन रनटाइम जहां मार्शलबीरफ नहीं है और वह समस्या थी ... –