Как получить доступ к внутренним объектам из размещенного IronPython?
-
08-07-2019 - |
Вопрос
Я использую IronPython 2.0 в приложении C # / Winforms. Мне бы хотелось, чтобы Python имел доступ к различным глобальным статическим объектам в главном приложении.
В качестве примера, в хост-приложении есть внутренний статический класс 'Global', который содержит несколько статических открытых членов, которые представляют собой различные глобальные объекты, к которым я хотел бы получить доступ:
static class Global
{
public static FeederSystem Feed ...
public static LightingSystem Lighting ...
public static IOSystem Io ...
... etc
}
Я хочу иметь возможность ссылаться на Global.Lighting.xxx в коде Python, как и в приложении C #.
Существует ли IronPythonic-эквивалент InternalsVisibleTo, который я могу использовать, чтобы код Python мог видеть внутренние типы хост-приложения? Или мне нужно сделать их всех публичными?
Решение
Хорошо, я решил это сам, с помощью спецификации DLR, отсюда https://github.com/IronLanguages/dlr/blob/master/Docs/dlr-spec-hosting.pdf и просмотрев источник IP / DLR. р>
Это не очень элегантно, и использование объекта ScriptRuntimeSetup со свойством PrivateBinding, установленным в значение True, вероятно, будет более точным путем, чем использование CreateEngine.
Но этот работает:
Dictionary<string, object> options = new Dictionary<string, object>();
options.Add("PrivateBinding", true);
_engine = Python.CreateEngine(options);