在IronPython中创建System.Windows.Media.Color

时间:2012-05-06 17:23:10

标签: c# ironpython

我正在使用IronPython并尝试从脚本中实例化一种颜色并将其返回。 我得到了这个方法,并将此字符串作为参数发送

@"
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);
}

当我运行此代码时,我得到了

  

$ exception {System.InvalidOperationException:Sequence不包含匹配元素      在System.Linq.Enumerable.First [TSource](IEnumerable`1 source,Func`2谓词)..等等。

我无法弄清楚如何让它发挥作用,所以请帮助我。

1 个答案:

答案 0 :(得分: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);
    }
}