2009-01-23 29 views
4

一是一些背景(柜面它可以帮助):问题与在C#的Web应用程序中嵌入的IronPython 2

我的应用程序是一个基于Web的框架,最近升级到.NET Framework V3.5的但不使用母版页/用户控制系统。它更类似于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没有导入()方法并且ImportModule()方法似乎不以相同的方式工作。导入()缓解了需要把线在我们写每一个python脚本,如:

from MyAssembly import MyClass 

的事实,MyClass的是充满了静态方法,手段,调用MyClass.MyMethod()工作非常好。我不能仅仅实例化一个对象,并将它分配给作用域中的一个变量,因为MyClass所在的程序集在运行时动态加载。

我们

我已经整理出来的IronPython 2.0的集成的所有其他部分,但宁愿不要求我的实施者“从MyAssembly程序导入MyClass的”请在每个脚本的顶部的问题他们写道(只是在ipy 1.x中没有必要时才显得很愚蠢),并且很可能成为一段时间的支持问题。

最后的问题

有没有人有这个问题,并解决它?我是否在为DLR做错事情?还是我错过了明显的东西?

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

回答

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

感谢威尔伯福斯,

最后我做了以下内容:

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

Scope.SetVariable("MyClass", var); 

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

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

相关问题