Создайте класс. Net из железа Python без образца - PullRequest
1 голос
/ 29 февраля 2020

Чтобы использовать класс из хост-приложения. Net в Iron Python, вы можете сделать это:

import clr
clr.AddReference('MyApplication')
from MyApplication import MyClass

x = MyClass()

Но как мне сделать это без первых 3 строк или, возможно, каким-то образом выполнить их в хост-приложении до запуска скрипта?

Ответы [ 2 ]

1 голос
/ 01 марта 2020

В Microsoft.Scripting.Hosting (который является частью динамической c языковой среды выполнения, используемой в Iron Python), у вас есть концепция ScriptScope , в которой вы можете выполнять операторы или исходные сценарии.

Это позволяет вам выполнить шаблон в области видимости перед выполнением фактического сценария. Следующий пример показывает основную идею c:

var engine = Python.CreateEngine();
var scope = engine.CreateScope();

var boilerplateSourceText = @"import clr
clr.AddReference('MyApplication')
from MyApplication import MyClass
";

var boilerplateSource = engine.CreateScriptSourceFromString(boilerplateSourceText, SourceCodeKind.Statements);
boilerplateSource.Execute(scope);

var scriptSource = engine.CreateScriptSourceFromString("x = MyClass()", SourceCodeKind.Statements);
scriptSource.Execute(scope);
0 голосов
/ 02 марта 2020

Вы можете добавить классы в область действия, как переменные с SetVariable. В VB. Net:

Dim engine As Microsoft.Scripting.Hosting.ScriptEngine = IronPython.Hosting.Python.CreateEngine()
Dim scope As Microsoft.Scripting.Hosting.ScriptScope = engine.CreateScope()
scope.SetVariable("MyClass", IronPython.Runtime.Types.DynamicHelpers.GetPythonTypeFromType(GetType(MyClass)))
Dim source As Microsoft.Scripting.Hosting.ScriptSource = engine.CreateScriptSourceFromFile(pathToScript)
source.Execute(scope)
...