从 IronPython 脚本 (lightswitch) 访问主机 class
access host class from IronPython script (lightswitch)
我是这方面的新手,所以我希望这个问题结构合理,足以让别人理解我在问什么,否则我很乐意添加更多细节。我正在尝试从 python 脚本引用在 lightswitch 应用程序的服务器端定义的变量。以下 post 解释了如何从 python 脚本访问主机 class。
Access host class from IronPython script
我服务器端的代码是
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.LightSwitch;
using Microsoft.LightSwitch.Security.Server;
using System.IO.Ports;
using System.Threading;
using IronPython.Hosting;
namespace LightSwitchApplication
{
public partial class ApplicationDataService
{
partial void ServerCommands_Inserting(ServerCommand entity)
{
switch (entity.ClientCommand)
{
case "RunPythonScript":
var engine = Python.CreateEngine();
var searchPaths = engine.GetSearchPaths();
searchPaths.Add(@"C:\Temp");
engine.SetSearchPaths(searchPaths);
var mainfile = @"C:\Temp\script.py";
var scope = engine.CreateScope();
engine.CreateScriptSourceFromFile(mainfile).Execute(scope);
var param1 = entity.Param1;
engine.Execute(scope);
如何从 Python 脚本中引用下面的服务器端变量?
entity.Param1
在 python 脚本中,我尝试导入一个服务器端 class,这将允许我访问变量
import clr
clr.AddReference("Microsoft.Lightswitch.Application")
但是 .Server 引用不可用...只有 .Base 可用。
from Microsoft.Lightswitch.Framework.Base import
我不知道 Framework.Server class 是否正确,目前只是猜测。谢谢!
您可以简单地将 entity
设置为范围的变量。您也可以将它传递给 script.py
中的函数。例如:
您的 python 脚本:
class SomeClass:
def do(self, entity):
print entity.Param1
您的 C# 代码将如下所示:
var engine = Python.CreateEngine();
var searchPaths = engine.GetSearchPaths();
searchPaths.Add(@"C:\Temp");
engine.SetSearchPaths(searchPaths);
var mainfile = @"C:\Temp\script.py";
var scope = engine.CreateScope();
// Execute your code
engine.CreateScriptSourceFromFile(mainfile).Execute(scope);
// Create a class instance
var type = scope.GetVariable("SomeClass");
var instance = engine.Operations.CreateInstance(type);
// Call `do` method
engine.Operations.InvokeMember(instance, "do", entity); // PASS YOUR ENTITY HERE
在此之后,您可以在 IronPython 脚本中访问完整的实体。你不需要 clr.AddReference("Microsoft.Lightswitch.Application")
.
另外,第二个execute(engine.Execute(scope);
)好像也不是必须的。
也许这对你有帮助。
我是这方面的新手,所以我希望这个问题结构合理,足以让别人理解我在问什么,否则我很乐意添加更多细节。我正在尝试从 python 脚本引用在 lightswitch 应用程序的服务器端定义的变量。以下 post 解释了如何从 python 脚本访问主机 class。
Access host class from IronPython script
我服务器端的代码是
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.LightSwitch;
using Microsoft.LightSwitch.Security.Server;
using System.IO.Ports;
using System.Threading;
using IronPython.Hosting;
namespace LightSwitchApplication
{
public partial class ApplicationDataService
{
partial void ServerCommands_Inserting(ServerCommand entity)
{
switch (entity.ClientCommand)
{
case "RunPythonScript":
var engine = Python.CreateEngine();
var searchPaths = engine.GetSearchPaths();
searchPaths.Add(@"C:\Temp");
engine.SetSearchPaths(searchPaths);
var mainfile = @"C:\Temp\script.py";
var scope = engine.CreateScope();
engine.CreateScriptSourceFromFile(mainfile).Execute(scope);
var param1 = entity.Param1;
engine.Execute(scope);
如何从 Python 脚本中引用下面的服务器端变量?
entity.Param1
在 python 脚本中,我尝试导入一个服务器端 class,这将允许我访问变量
import clr
clr.AddReference("Microsoft.Lightswitch.Application")
但是 .Server 引用不可用...只有 .Base 可用。
from Microsoft.Lightswitch.Framework.Base import
我不知道 Framework.Server class 是否正确,目前只是猜测。谢谢!
您可以简单地将 entity
设置为范围的变量。您也可以将它传递给 script.py
中的函数。例如:
您的 python 脚本:
class SomeClass:
def do(self, entity):
print entity.Param1
您的 C# 代码将如下所示:
var engine = Python.CreateEngine();
var searchPaths = engine.GetSearchPaths();
searchPaths.Add(@"C:\Temp");
engine.SetSearchPaths(searchPaths);
var mainfile = @"C:\Temp\script.py";
var scope = engine.CreateScope();
// Execute your code
engine.CreateScriptSourceFromFile(mainfile).Execute(scope);
// Create a class instance
var type = scope.GetVariable("SomeClass");
var instance = engine.Operations.CreateInstance(type);
// Call `do` method
engine.Operations.InvokeMember(instance, "do", entity); // PASS YOUR ENTITY HERE
在此之后,您可以在 IronPython 脚本中访问完整的实体。你不需要 clr.AddReference("Microsoft.Lightswitch.Application")
.
另外,第二个execute(engine.Execute(scope);
)好像也不是必须的。
也许这对你有帮助。