Come posso accedere agli oggetti interni da IronPython ospitato?
-
08-07-2019 - |
Domanda
Sto ospitando IronPython 2.0 in un'applicazione C # / Winforms. Vorrei che Python fosse in grado di accedere a vari oggetti statici globali nell'applicazione host.
Ad esempio, l'applicazione host ha una classe statica interna "Global", che contiene un numero di membri pubblici statici, che sono i vari oggetti globali a cui vorrei accedere:
static class Global
{
public static FeederSystem Feed ...
public static LightingSystem Lighting ...
public static IOSystem Io ...
... etc
}
Voglio poter fare riferimento a Global.Lighting.xxx nel codice Python, proprio come posso nell'applicazione C #.
Esiste un equivalente IronPythonic di 'InternalsVisibleTo' che posso usare per consentire al codice Python di vedere i tipi interni dell'applicazione host? O devo renderli tutti pubblici?
Soluzione
Ok, quindi l'ho risolto da solo, con l'aiuto della specifica DLR, da qui https://github.com/IronLanguages/dlr/blob/master/Docs/dlr-spec-hosting.pdf e guardando l'origine IP / DLR.
Questo non è molto elegante e l'utilizzo di un oggetto ScriptRuntimeSetup con la proprietà PrivateBinding impostata su True sarebbe probabilmente una route più ordinata rispetto all'utilizzo di CreateEngine.
Ma questo funziona:
Dictionary<string, object> options = new Dictionary<string, object>();
options.Add("PrivateBinding", true);
_engine = Python.CreateEngine(options);