Comment accéder aux objets internes à partir d'IronPython hébergé?
-
08-07-2019 - |
Question
J'héberge IronPython 2.0 dans une application C # / Winforms. J'aimerais que Python puisse accéder à divers objets globaux et statiques dans l'application hôte.
Par exemple, l'application hôte a une classe statique interne "Global", qui contient un certain nombre de membres publics statiques, qui sont les différents objets globaux auxquels je souhaite accéder:
static class Global
{
public static FeederSystem Feed ...
public static LightingSystem Lighting ...
public static IOSystem Io ...
... etc
}
Je souhaite pouvoir faire référence à Global.Lighting.xxx en code Python, exactement comme dans l'application C #.
Existe-t-il un équivalent IronPythonic de 'InternalsVisibleTo' que je peux utiliser pour permettre au code Python de voir les types internes de l'application hôte? Ou dois-je les rendre publiques?
La solution
D'accord, j'ai donc moi-même résolu ce problème, à l'aide de la spécification DLR, à partir d'ici https://github.com/IronLanguages/dlr/blob/master/Docs/dlr-spec-hosting.pdf et en consultant la source IP / DLR.
Cela n'est pas très élégant et l'utilisation d'un objet ScriptRuntimeSetup avec la propriété PrivateBinding définie sur True serait probablement un itinéraire plus ordonné que l'utilisation de CreateEngine.
Mais celui-ci fonctionne:
Dictionary<string, object> options = new Dictionary<string, object>();
options.Add("PrivateBinding", true);
_engine = Python.CreateEngine(options);