2

我使用 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:序列在 System.Linq.Enumerable.First[TSource](IEnumerable`1 源,Func`2 谓词)中不包含匹配元素.. 等等。

我不知道如何让它工作,所以请帮助我。

4

1 回答 1

0

在我看到更多源代码或完整堆栈之前,我无法确定,但我猜你缺少让 python 引擎包含对必要 WPF 程序集的引用(System.Windows.Media.Color 的 PresentationCore 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);
    }
}
于 2012-05-06T20:31:26.867 回答