2009-09-01 7 views
6

私は明白なことを試してみました:、タイプはメンバーのMicrosoft.Scripting.Hosting.ScriptRuntimeSetup、Microsoft.Scriptingのために解決されていない、バージョン= 0.9.0.0:別のAppDomainでIronPythonエンジンをホストする方法は?

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

しかし、私は次のエラーメッセージを取得しています文化=ニュートラル、PublicKeyToken = 31bf3856ad364e35 '。私は新しいコンソールアプリケーションに関連したものをコピーすることによって、最小限の再生プロジェクトを作成しようとしました

:このエラーのためにグーグルで

は実りSOFAR ...

EDIT#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(); 
     } 
    } 
} 

これは期待どおりに機能します。

私はこのエラーが私がコメントした行のうちの1つに関連していると結論づけました:エンジンに追加されたスコープには、ほとんど制御できないオブジェクトが含まれています - プラグインホストへの参照このソフトウェアは、(Autodesk Revit Architecture 2010)を実行するためのものです。

多分、それを渡そうとしているのはエラーを作り出すものですか?

代わりにプロキシを渡す方法はありますか?私は他のAppDomainにプロキシすることはできないんスコープを経由してオブジェクトを渡すまで問題が削れている

EDIT#2を(... .NETリモーティングをルックアップする必要があります):異なるAppDomainで実行されているIronPythonインタープリタのスコープに追加されたすべてのオブジェクトは、何らかの形でマーシャリングする必要があります。したがって、MarshalByRefObjectを拡張するか、Serializableにする必要があります。

+0

これをコンパイル/実行する方法に関する詳細情報を提供できますか? "test.cs"をProgram Filesディレクトリに入れて実行すると、これは2.0.2と2.6 Beta 2に対して動作します。また、.NET 2.0/3.0/3.5または.NET 4に対して実行していますか? –

+0

私はそれがこのアプリケーションドメインで作成するストリームですが、別のアプリケーションドメインでマシンを実行させることをお勧めします... – cRichter

答えて

2

新しいAppDomainで実行される独自のブートストラップクラスを作成してそこにIronPytonの初期化を行いますが、これで問題は解決しますか?

+0

私は問題を他のものに減らすことができました - 私が渡したいオブジェクトIronPythonランタイムはMarshalByRefではなく、それは問題でした... –

関連する問題