私は明白なことを試しました:
var appDomain = AppDomain.CreateDomain("New Domain");
var engine = IronPython.Hosting.Python.CreateEngine(appDomain); // boom!
しかし、次のエラー メッセージが表示されます: Type is not resolve for member 'Microsoft.Scripting.Hosting.ScriptRuntimeSetup,Microsoft.Scripting, Version=0.9.0.0, Culture=neutral, 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();
}
}
}
これは期待どおりに機能します。
したがって、私が得ているエラーは、コメントアウトした行の 1 つに関連していると結論付けざるを得ません。エンジンに追加されたスコープには、私がほとんど制御できないオブジェクトが含まれています。 (Autodesk Revit Architecture 2010)で。
たぶん、それを渡そうとするとエラーが発生しますか?
代わりにプロキシを渡す方法はありますか? (.NET リモーティングを検索する必要があります...)
編集#2:
別の AppDomain にプロキシできないスコープを介してオブジェクトを渡すことに問題を絞り込みました: 別の AppDomain で実行されている IronPython インタープリターのスコープに追加されたすべてのオブジェクトは、何らかの方法でマーシャリングする必要があり、したがって、拡張MarshalByRefObject
または拡張する必要があります。するSerializable
。