Como faço para acessar objetos internos do IronPython hospedado?
-
08-07-2019 - |
Pergunta
Eu estou hospedando IronPython 2.0 em um aplicativo C # / WinForms. Gostaria Python para acessar a vários objetos globais, estáticos no aplicativo host.
Como exemplo, o aplicativo host tem uma classe interna estática 'global', que contém um número de membros públicos estáticos, que são são os vários objetos globais que eu gostaria de acesso:
static class Global
{
public static FeederSystem Feed ...
public static LightingSystem Lighting ...
public static IOSystem Io ...
... etc
}
Eu quero ser capaz de se referir a Global.Lighting.xxx em código Python, assim como eu posso na aplicação C #.
Existe um equivalente IronPythonic de 'InternalsVisibleTo', que eu possa usar para permitir que o código Python para ver os tipos internos do aplicativo host? Ou eu preciso para torná-los todos os públicos?
Solução
Ok, então eu trabalhei isso mesmo, com a ajuda da especificação DLR, a partir daqui https://github.com/IronLanguages/dlr/blob/master/Docs/dlr-spec-hosting.pdf e, olhando para o IP de origem / DLR.
Isto não é muito elegante, e usando um objeto ScriptRuntimeSetup com o conjunto de propriedades PrivateBinding verdadeira provavelmente seria uma rota mais puro do que usando CreateEngine.
Mas este obras:
Dictionary<string, object> options = new Dictionary<string, object>();
options.Add("PrivateBinding", true);
_engine = Python.CreateEngine(options);