2012-05-06 13 views
2
でSystem.Windows.Media.Color

イムを作成し、私はスクリプトから色をインスタンス化し、それを返すようにしてみてください。 私はこの方法を持って、私はこのコードを実行すると、私はIronPythonのを使用して、IronPythonの

$例外{System.InvalidOperationExceptionが取得

@" 
from System.Windows.Media import Color 
c = Color() 
c.A = 100 
c.B = 200 
c.R = 100 
c.G = 150 
c 
"); 

_python = Python.CreateEngine(); 

public dynamic ExectureStatements(string expression) 
{ 
    ScriptScope scope = _python.CreateScope(); 
    ScriptSource source = _python.CreateScriptSourceFromString(expression); 
    return source.Execute(scope); 
} 

引数としてこの文字列に送信します。シーケンスはSystem.Linqのに一致する要素 が含まれていませんが.Enumerable.First [TSource](IEnumerable`1ソース、Func`2述語)..等

私はこれを動作させる方法を理解できませんので、助けてください。

+0

をプリントアウトし、あなたはスタック全体、プロジェクト内の他の供給源を提供することができ? –

+0

残念ながら、例外は実際の問題を指摘するものではありません。これはIronPythonのホスティングにおけるバグです:http://ironpython.codeplex.com/workitem/32679。実際の例外は失われます。 –

+0

Simon900225、あなたが持っているエラーの原因となる最小限のプロジェクトを提供できますか?私はそれを再現することはできません。 –

答えて

0

ソースまたはフルスタックのいずれかが表示されるまではわかりませんが、Pythonエンジンに必要なWPFアセンブリ(PresentationCore for System.Windows)が含まれていないと思います.Media.Color AFAICT)。

同じライブラリへの参照を必要とするC#呼び出し側を気にするかどうかによって、参照の取得方法を変更できますが、PresentationCoreを追加するだけで、必要なアセンブリ(文字列なし)それをIronPythonランタイムに渡します。

以下のコードは正常に動作し、私はあなたのソース内の最初の呼び出しが表示されていないので#646496C8

using System; 
using IronPython.Hosting; 
using Microsoft.Scripting.Hosting; 

class Program 
{ 
    private static ScriptEngine _python; 
    private static readonly string _script = @" 
from System.Windows.Media import Color 
c = Color() 
c.A = 100 
c.B = 200 
c.R = 100 
c.G = 150 
c 
"; 


    public static dynamic ExectureStatements(string expression) 
    { 
     var neededAssembly = typeof(System.Windows.Media.Color).Assembly; 
     _python.Runtime.LoadAssembly(neededAssembly); 
     ScriptScope scope = _python.CreateScope(); 
     ScriptSource source = _python.CreateScriptSourceFromString(expression); 
     return source.Execute(scope); 
    } 

    static void Main(string[] args) 
    { 
     _python = Python.CreateEngine(); 
     var output = ExectureStatements(_script); 
     Console.WriteLine(output); 
    } 
}