6

私は明白なことを試しました:

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

4

1 に答える 1