【问题标题】:Issues with embedding IronPython 2 in a C# web application在 C# Web 应用程序中嵌入 IronPython 2 的问题
【发布时间】:2009-01-23 03:35:31
【问题描述】:

先介绍一些背景(如果有帮助的话):

我的应用程序是最近升级到 .Net Framework v3.5 的基于 Web 的框架,但不使用母版页/用户控制系统。它更类似于 MVC 模式(虽然更老),并从模板的响应流中输出纯 HTML。 Python 表达式允许实现一些规则和模板变体。

老办法

在 C# 中嵌入 IronPython 1.x 引擎时,我们能够编写如下代码:

PythonEngine pe = new PythonEngine();
Assembly a = Assembly.LoadFile("path to assembly");
pe.LoadAssembly(a);
pe.Import("Script");

在 ipy 2.0 中没有 Import() 方法,并且 ImportModule() 方法的工作方式似乎不同。 Import() 减少了在我们编写的每个 python 脚本中添加一行的需要,例如:

from MyAssembly import MyClass

MyClass 充满了静态方法,这意味着对 MyClass.MyMethod() 的调用非常有效。我不能只实例化一个对象并将其分配给范围内的变量,因为 MyClass 包含在其中的程序集是在运行时动态加载的。

现在讨论问题

我已经整理了 IronPython 2.0 集成的所有其他部分,但不希望我的实现者在他们编写的每个脚本的顶部键入“from MyAssembly import MyClass”(如果没有必要,这似乎很愚蠢在 ipy 1.x 中)并且可能在一段时间内也是一个支持问题。

最后是问题

有人遇到过这个问题并解决了吗?我是否以错误的方式为 DLR 做事?还是我遗漏了一些明显的东西?

我不确定需要有人提供帮助的详细信息,但我希望这已经足够了。

【问题讨论】:

    标签: c# ironpython embedding


    【解决方案1】:

    加载程序集后,您可以在用于运行脚本的 Scope 中执行导入:

    ScriptEngine engine = Python.CreateEngine();
    engine.Runtime.LoadAssembly(a);
    string code = "from MyAssembly import MyClass";
    ScriptSource source = engine.CreateScriptSourceFromString(code, "<import>", SourceCodeKind.Statements);
    CompiledCode c = source.Compile();
    
    Scope scope = engine.CreateScope();
    c.Execute(scope);
    
    // then run your script in the same scope
    

    我们在产品中做了类似的事情。

    (希望这是有效的 C# - 我实际上在 IronPython 本身中尝试过,因为它更方便。)

    【讨论】:

      【解决方案2】:

      感谢威尔伯福斯,

      最后我做了以下事情:

      Assembly a = Assembly.LoadFile("path to assembly");
      object var = a.CreateInstance("MyNamespace.MyClass");
      
      Scope.SetVariable("MyClass", var);
      

      这在 C# 中创建了我的类的一个对象,然后将其作为变量传递给 IronPython 范围。

      注意,这是在 C# 范围 (AppDomain) 中创建对象并将其传递给 IronPython。这似乎(到目前为止)适用于我的问题,因为我传递的对象仅包含静态方法,但可能不适用于具有状态的类。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-06
        • 2011-02-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多