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?
You can expose a single object in C# like so:
The object is the available in the script using the given name
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.
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:
Inject it into ScriptRuntime.Globals and it'll be available for import
Inject it into a ScriptScope against some code you're going to be running
Inject it into the PythonType.GetBuiltinModule() scope and it'll be available w/o importing