IronPython将.Net类型暴露给运行时引擎

时间:2010-02-05 17:55:08

标签: .net ironpython dynamic-language-runtime

我希望将特定的.Net类型公开给IronPython运行时。我可以这样做:

ScriptEngine engine = Python.CreateEngine();
ScriptScope scope = engine.CreateScope();
engine.Runtime.LoadAssembly(typeof(Program).Assembly); // current assembly with types

但这会将所有类型暴露给运行时。是否可以选择性加载?

3 个答案:

答案 0 :(得分:3)

实际上有几个选项,但它们都不是自动的。首先,您需要调用DynamicHelpers.GetPythonTypeFromType(typeof(TypeToInject))来获取实际可用的PythonType对象。然后你可以:

  1. 将其注入ScriptRuntime.Globals并且可以导入

  2. 针对您将要运行的某些代码将其注入ScriptScope

  3. 将其注入PythonType.GetBuiltinModule()范围,并且无需导入即可使用

答案 1 :(得分:2)

不,你必须加载整个组件。

这是由ScriptDomainManager内部管理的,它只保留已加载程序集的列表,而不是类型。

最好的选择是让你的程序集只公开你想要在Python环境中公开的类型,并将其余的类型留在内部。

答案 2 :(得分:0)

您可以在C#中公开单个对象,如下所示:

ScriptScope scope = runtime.CreateScope(); //get a scope where we put in the stuff from the host
scope.SetVariable("lab", lab);

该对象在脚本中可用,使用给定名称

lab.AnyMethodOfYourObject()