2010-02-05 12 views
5

Sto cercando di esporre tipi specifici .Net al runtime IronPython. Posso fare questo:IronPython che espone il tipo .Net al motore runtime

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

Ma che espone tutti i tipi al runtime. È possibile il caricamento selettivo del tipo?

risposta

2

No, è necessario caricare l'intero assieme.

Questo è gestito internamente dal ScriptDomainManager, che conserva solo un elenco di assiemi caricati, non di tipi.

L'opzione migliore sarebbe quella di fare in modo che l'assembly esponga solo i tipi pubblici che si desidera siano disponibili all'interno del proprio ambiente Python e lasciano il resto dei tipi interni.

+0

l'accesso a livello di classe è possibile, vedere la mia risposta. – Marcel

3

In realtà ci sono alcune opzioni, nessuna di queste è automatica. Per prima cosa è necessario chiamare DynamicHelpers.GetPythonTypeFromType (typeof (TypeToInject)) per ottenere un oggetto PythonType che sarà effettivamente utilizzabile. Quindi è possibile:

  1. Iniettare in ScriptRuntime.Globals e sarà disponibile per l'importazione

  2. iniettarlo in uno ScriptScope contro alcuni codice che sta andando ad essere in esecuzione

  3. iniettarla nel campo di applicazione PythonType.GetBuiltinModule() e sarà disponibile w/o importazione

0

è possibile esporre un singolo oggetto in C# li ke così:

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

L'oggetto è la disposizione nello script utilizzando il nome dato

lab.AnyMethodOfYourObject() 
Problemi correlati