2010-02-05 17 views
5

Szukam odsłonić konkretne typy .Net do środowiska wykonawczego IronPython. Mogę to zrobić:IronPython odsłaniający typ .Net do aparatu wykonawczego

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

Ale to naraża wszystkie typy na starcie. Czy możliwe jest selektywne ładowanie typu?

Odpowiedz

2

Nie, musisz załadować cały zespół.

To jest zarządzane wewnętrznie przez ScriptDomainManager, który przechowuje tylko listę załadowanych zestawów, a nie typy.

Najlepszym rozwiązaniem byłoby sprawienie, że Twój zestaw tylko publicznie udostępni typy, które chcesz mieć w swoim środowisku Python, i pozostawia pozostałe typy w pamięci wewnętrznej.

+0

dostęp na poziomie klasy jest możliwe, zobaczyć moją odpowiedź. – Marcel

3

Istnieje jednak kilka opcji, z których żadna nie jest automatyczna. Najpierw musisz wywołać DynamicHelpers.GetPythonTypeFromType (typeof (TypeToInject)), aby uzyskać obiekt PythonType, który będzie faktycznie użyteczny. Następnie można:

  1. wstrzyknąć go do ScriptRuntime.Globals i to będzie dostępne dla importu

  2. wstrzyknąć go do ScriptScope wobec niektórych kodu masz zamiar zostać uruchomiony

  3. wstrzyknąć go do PythonType.GetBuiltinModule (zakres) i będzie ona dostępna w/o imporcie

0

można wystawiać pojedynczy obiekt w C# li ke więc:

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

Obiekt jest dostępny w skrypcie za pomocą podanej nazwie

lab.AnyMethodOfYourObject()