从 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);)好像也不是必须的。 也许这对你有帮助。