2012-05-06 2 views
2

Я использую IronPython, и я пытаюсь создать экземпляр цвета из скрипта и вернуть его. Я получил этот метод и отправить в этой строке в качестве аргументаСоздание System.Windows.Media.Color в 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); 
} 

Когда я запускаю этот код я получаю

$ исключение {System.InvalidOperationException: Последовательность не содержит соответствующий элемент в System.Linq .Enumerable.First [TSource] (источник IEnumerable`1, Func`2 предикат) .. и т.д.

Я не могу понять, как заставить это работать, поэтому, пожалуйста, помогите мне.

+0

Поскольку я не вижу Первый вызов в источнике, не могли бы вы предоставить весь стек и любой другой источник в этом проекте? –

+0

Исключение, к сожалению, не указывает на актуальную проблему - это ошибка при размещении IronPython: http://ironpython.codeplex.com/workitem/32679. Исключено исключение. –

+0

Simon900225, сможете ли вы предоставить минимальный проект, который вызывает ошибку? Я не могу воспроизвести его. –

ответ

0

Я не буду знать наверняка, пока не увижу больше вашего источника или полного стека, но я бы предположил, что вам не хватает, если механизм python включает ссылку на необходимые сборки WPF (PresentationCore для 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); 
    } 
} 
Смежные вопросы