29.03.2013, 13:12 | #61 |
Участник
|
ГЫ!!!!!
создал свои классы по образцу. иcпользовал тип Name. Запустил. Получил Label = Name Изменил тип Name на description везде. Сделал инкрементную в CIL запустил, получил все тот же Name. Не работают. Непонятно где именно происходит invoke. об этом я уже отвечал Вадиму Цитата:
Ладно, я понял Спасибо за конструктив. Щас попробую еще повторить в виртуалке от Майкрософт. И закрою эту дверь. |
|
29.03.2013, 13:15 | #62 |
Участник
|
|
|
29.03.2013, 13:17 | #63 |
Участник
|
|
|
29.03.2013, 14:23 | #64 |
Участник
|
Цитата:
уже было. Цитата:
Сообщение от mazzy
я не про staticmethodstr
я про invokeStaticMethodIL, который выполняется в дальнейшем. во-первых, они ВЫНУЖДЕНЫ делать assert для invoke. во-вторых, invoke уже не ловится перекрестными ссылками. И встав мышкой на метод контролера мы НЕ узнаем, где же он вызывается. Нужен дополнительный и трудоемкий анализ. |
|
29.03.2013, 15:22 | #65 |
Участник
|
Цитата:
см. скриншот ну, и чтобы два раза не вставать. желающие могут повторить на новом Фреймворке функционал простейшего (для ax2009) диалога. диалог нужен, например, для того, чтобы в пакетнике обрабатывать какой-нибудь файл. до лучших времен |
|
29.03.2013, 16:58 | #66 |
Участник
|
Цитата:
Цитата:
ну, и чтобы два раза не вставать. желающие могут повторить на новом Фреймворке функционал простейшего (для ax2009) диалога.
Цитата:
Блаба для нашего программиста вполне достаточно, так как он думает на Блабе. ? |
|
31.03.2013, 12:45 | #67 |
Участник
|
Посмотрел.
У меня смена EDT и добавление методов отрабатывает после Tools\Caches\Refresh elements (нашел просто методом тыка сперва подумав где может быть) Синтаксическим переименованием не пользовался. С полпинка не заработало - как с methodStr так и с просто вызовом - не мог бы ты проверить (у меня вот такой main): X++: static void main(Args _args) { new SysOperationServiceController(classStr(TEST_HelloOp), methodStr(TEST_HelloOp, sayHello), SysOperationExecutionMode::Synchronous) .startOperation(); new TEST_HelloOp().sayHello(new TEST_HelloContract()); } Дело в том что для RunBase есть совершенно та же сама проблема: когда мы встаем на Run и вызываем перекрестные ссылки, то мы видим 1) В типичном случае одну ссылку из метода main того же класса 2) Дерево наследования, которое по хорошему тоже надо просмотреть. (Так как run можно вызвать везде, где можно вызвать runbase.run и из наследников данного класса тоже) У меня, в Ax6 187 таких ссылок (на runbase.run). Но это не является проблемой. Потому, что у нас есть априорное знание, что в типичном случае, мы вызываем наш RunBase и main этого же класса и + он вызывается из недр фреймворка при пакетной обработке. нам остается только проверить, что заданный случай сводится к типичному. Для этого мы 1. Ищем ссылки на run нашего класса + всех нефреймворковых наследников и предков. 2. Ищем ссылки на наш класс и проверяем, что там где он создан, он никуда не передается,а вызывается prompt и run Примерно по такой же схеме мы идем и в случае SysOperation - мы ищем ссылки на нашу операцию и убеждаемся, что дальше происходит только startOperation. Если сделать перекрестные ссылки, которые сразу показывают код - достаточно 1 клика (см атач) в нашем случае. Таким образом, у нас в этом вопросе нет существенной разницы между SysOperation и runbase - единственная разница в том, что к последней мы еще не привыкли. По поводу копипаста После копипаста надо еще не забыть переименовать. Один раз я долго тупил, пока не обнаружил, что в main вызывается другой класс. Еще была забавная ошибка, когда кто-то забыл добавить параметр "дата" в макрос для распаковки/упаковки и обнаружилось это только когда попробовали запихать класс в пакетное задание. Еще недавно попробовал поискать на типичные ошибки копипасты в коде приложения конструкции типа X++: switch (x) { case y: ... case y: ... } Последний раз редактировалось belugin; 31.03.2013 в 12:59. |
|
|
За это сообщение автора поблагодарили: mazzy (2), sukhanchik (2), Logger (3). |
31.03.2013, 14:24 | #68 |
Участник
|
Цитата:
Цитата:
Цитата:
Цитата:
в случае SysOperation мы НЕ видим. Или можешь подсказать как найти "чем используется" метод TEST_HelloOp.SeyHello в твоем примере? Если написать код c main как в примере, то как найти "чем используется" метод SayHello? (кстати, я так и не понял как писать метод main для твоего примера. Можешь привести проект с main?) |
|
|
За это сообщение автора поблагодарили: Logger (1). |
31.03.2013, 19:13 | #69 |
Участник
|
В принципе согласен:
Вариант 1. Мы инопланетяне, прилетевшие с планеты где не знают про RunBase и SysOperation Для SysOperation нам надо посмотреть: - перекрестные ссылки на метод - перекрестные ссылки на DictClass.callObject - и на \System Documentation\Classes\xApplication\runAsync - и использование ключевого слова runAs Для RunBase: - перекрестные ссылки на MyClass.run - перекрестные ссылки на RunBase.run Собственно это проблема примерно одна и та же - наличия полиморфизма + передача по ссылке. (представь себе, если б в runbase был метод X++: void startOperation() { if (this.prompt) { this.run(); } } НО! В данном случае это проблемой не является - так как я вижу вызов startOperation сразу же за созданием контроллера и мне не важно где происходит кокретный callObjectMethod. В-общем, это проблема полиморфизма + передачи ссылок. Только в случае runBase исследование кода легче для инопланетянина за счет того, что методы, которые планируются вызвать через RunBase явно принадлежат его подклассам. Для неинопланетянина это примерно одно и то же для обоих фреймворков. Пример прицепил (для нагладности запуск поместил в отдельный класс). Последний раз редактировалось belugin; 31.03.2013 в 19:18. |
|
17.07.2013, 01:44 | #70 |
Роман Долгополов (RDOL)
|
Цитата:
Да, действительно кеш в\Classes\SysOperationAttributedDataContractInfo\buildDataMemberMaps Лазить в Tools\Caches\Refresh elements каждый раз лень, а может непривычно (но не суть) - по сему добавил сброс кеша в инкрементную компиляцию. \Classes\SysCompilerOutput\compileForwardElement X++: public static client void compileForwardElement(DictClass _dictClass, Dictionary _dictionary, int _numOfClasses) { #AOT ClassNode classNode; DictClass dictClassLoop; DictClass childClass; int i; if (_dictClass) { classNode = infolog.findNode(#ClassesPath + #AOTDelimiter + _dictClass.name()); // SysOperationAttributedDataContractInfo cache reset --> classFactory.globalObjectCache().remove('SysOperationAttributedDataContractInfo.buildDataMemberMaps', [_dictClass.id()]); // SysOperationAttributedDataContractInfo cache reset <-- if (classNode) { Дополнение. Наверное даже лучше добавить сброс кеша всех контрактов на окончание компиляции. Тормозов компиляции это не добавит, а кнопочка F7 всё таки приятнее контекстного меню \Classes\SysCompilerOutput\endCompilation X++: ..... this.setEndFocus(); } } // Notify the editors to allow them to update markings CompileOutputInfos::NotifyChanges(); classFactory.globalObjectCache().clear('SysOperationAttributedDataContractInfo.buildDataMemberMaps'); } Последний раз редактировалось db; 17.07.2013 в 02:08. |
|
|
За это сообщение автора поблагодарили: mazzy (2), sukhanchik (4), Logger (3), -DocSerzh- (1), alex55 (1), S.Kuskov (2). |
Теги |
ax2012, runbase, runbasebatch, sysoperation framework |
|
|