IronPython exposing .Net type to the runtime engin

2019-03-30 09:52发布

I'm looking to expose specific .Net types to the IronPython runtime. I can do this:

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

But that exposes all types to the runtime. Is selective type loading possible?

3条回答
劫难
2楼-- · 2019-03-30 09:55

You can expose a single object in C# like so:

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

The object is the available in the script using the given name

lab.AnyMethodOfYourObject()
查看更多
ゆ 、 Hurt°
3楼-- · 2019-03-30 10:04

No, you must load the entire assembly.

This is internally managed by the ScriptDomainManager, which only keeps a list of loaded assemblies, not types.

The best option would be to make your assembly only expose the types publicly that you want available within your Python environment, and leave the rest of the types internal.

查看更多
霸刀☆藐视天下
4楼-- · 2019-03-30 10:08

There are actually a few options none of them automatic though. First you'll need to call DynamicHelpers.GetPythonTypeFromType(typeof(TypeToInject)) to get a PythonType object which will actually be usable. Then you can either:

  1. Inject it into ScriptRuntime.Globals and it'll be available for import

  2. Inject it into a ScriptScope against some code you're going to be running

  3. Inject it into the PythonType.GetBuiltinModule() scope and it'll be available w/o importing

查看更多
登录 后发表回答