将IronPython 2嵌入C#Web应用程序的问题

时间:2009-01-23 03:35:32

标签: c# ironpython embedding

第一个背景(包括帮助):

我的应用程序是最近升级到.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集成的所有其他部分,但我们不希望我的实现者在他们编写的每个脚本的顶部输入“来自MyAssembly import MyClass”(只是在没有必要的时候看起来很傻)在ipy 1.x)并且可能暂时成为一个支持问题。

最后问题

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

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

2 个答案:

答案 0 :(得分:6)

加载程序集后,您可以在用于运行脚本的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中尝试过,因为它更方便。)

答案 1 :(得分:1)

感谢Wilberforce,

最后我做了以下事情:

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

Scope.SetVariable("MyClass", var);

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

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