Показать сообщение отдельно
Старый 28.08.2023, 15:19   #11  
Товарищ ♂uatr is offline
Товарищ ♂uatr
Участник
Аватар для Товарищ ♂uatr
MCBMSS
 
268 / 829 (28) +++++++
Регистрация: 23.10.2012
Привет.
Изучая Аксапту в поисках решения вопроса с кэшем (Как чистите глобальный кэш АОСов?) увидел библиотеку "Microsoft.Dynamics.AX.Xpp.Support.dll" - очень интересная.
Внутри неё сидит Microsoft.Dynamics.Ax.Xpp.XppObjectBase.
У меня сложилось впечатление, что это "базовая" точка вызова для всех функций.
Например в нём есть вот такая функция:
X++:
public static object StaticCall(string className, string methodName, object[] parameters, Type[] types, object[] varargs)
Но у этой библиотеки есть огромный минус - она в ссылках содержи Ax32Server.

В общем завела меня Аксапта в сторону (вообще другая библиотека)
Microsoft.Dynamics.AX.ManagedInterop.RuntimeContext::get_Current();
У которого есть всякие CallStaticClassMethod и тп.
При запуске которых из пакетного задания система не опознает их как IL код.
Можно предположить, что она считает его XPP.
Но у пакетного задания есть особенность - оно не заполняет в потоке Data - откуда по идее, должна браться сессия.
Поэтому сессию приходится инициализировать руками (это генерирует запись в активных пользователях):
new Microsoft.Dynamics.AX.ManagedInterop.Session() и нужно вызвать logon.
Microsoft.Dynamics.AX.ManagedInterop.Session это наследник от Microsoft.Dynamics.AX.ManagedInterop.RuntimeContext - приводим к родителю и вызываем нужный код.

Исходя из контекста задачи, так понимаю, что речь идёт о "hot swap" - оно кэширует где-то код. Только перезапуск АОСа актуализирует информацию.
В общем не выглядит как финальное решение, но шаг в его направлении.
За это сообщение автора поблагодарили: Logger (20), ivas (3).