views:

110

answers:

2

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?

+2  A: 

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.

Reed Copsey
+1  A: 

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

Dino Viehland