4

首先是一些背景(以防有帮助):

我的应用程序是最近升级到 .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 做事?还是我错过了一些明显的东西?

我不确定某人需要帮助的细节,但我希望这已经足够了。

4

2 回答 2

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 本身中尝试过的,因为它更方便。)

于 2009-01-23T14:57:27.370 回答
1

谢谢威尔伯福斯,

最后我做了以下事情:

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

Scope.SetVariable("MyClass", var);

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

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

于 2009-01-28T21:01:21.103 回答