06.10.2017, 16:16 | #1 |
Участник
|
А как в ax7 код метода получить?
Занимаюсь апгрейдом класса.
Раньше замечательно работало сравнение с OLD-слоем. Фиг с ним, сделал себе функцию вывода контента методов в текстовый файл. Для ax2012 все тупо, просто, быстро. А вот в ax7 выяснилось, что DictMethod.getSource - obsolete. хорошо, напрягся, переписал на Metadata. но и в нем axMethod.Source - пустой. Хотя axCalss.Declaration - вполне себе X++ код показывает. Ветку Channel9: Peter Villadsen and Gustavo Plancarte: X++ to MSIL Мне не нужен .net код, мне нужен X++ код. как можно получить? ================================ ax2012 X++: static void Job2(Args _args) { SysDictClass dc = new SysDictClass(classNum(EInvoiceCFDIXMLDocReader_MX)); TextBuffer text = new TextBuffer(); SetEnumerator se = dc.methods().getEnumerator(); SysDictMethod dm; Map mm = new Map(Types::String, Types::String); MapEnumerator me; while( se.moveNext() ) { dm = se.Current(); mm.insert(dm.name(), dm.getSource()); } me = mm.getEnumerator(); while( me.moveNext() ) { text.appendText(me.currentValue()); text.appendText('\n'); } text.toClipboard(); info("done."); } ax7.1 : X++: class ClassMethods { public static void main(Args _args) { TextBuffer text = new TextBuffer(); str packageDir = 'C:\AOSService\PackagesLocalDirectory'; //or var environment = Microsoft.Dynamics.ApplicationPlatform.Environment.EnvironmentFactory::GetApplicationEnvironment(); packageDir = environment.get_Aos().get_PackageDirectory(); // it's kind of magic var runtimeProviderConfiguration = New Microsoft.Dynamics.AX.Metadata.Storage.Runtime.RuntimeProviderConfiguration(packageDir); var metadataProviderFactory = New Microsoft.Dynamics.AX.Metadata.Storage.MetadataProviderFactory(); Microsoft.Dynamics.AX.Metadata.Providers.IMetadataProvider provider = metadataProviderFactory.CreateRuntimeProvider(runtimeProviderConfiguration); Map mm = new Map(Types::String, Types::String); Microsoft.Dynamics.AX.Metadata.MetaModel.AxClass c = provider.Classes.Read('EInvoiceXMLDocReader_MX'); for(int i=0; i<c.MethodCount(); ++i) { Microsoft.Dynamics.AX.Metadata.MetaModel.AxMethod m = c.GetMethod(i); mm.insert(m.Name, m.Source); } MapEnumerator me = mm.getEnumerator(); while( me.moveNext() ) { text.appendText(me.currentValue()); text.appendText('\n'); } File::SendStringAsFileToUser(text.toString(), 'methods.txt'); info("done."); } } |
|
06.10.2017, 16:34 | #2 |
Участник
|
похоже, что работающий ответ - работать с XML-файлом исходного кода напрямую, без
тогда вопрос скорее чисто теоретический - а можно ли получить исходный код из аксапты? |
|
07.10.2017, 13:59 | #3 |
Banned
|
Цитата:
Раньше он было внутри (AOD, потом база), а сейчас файловая система (wеb директория) которая снаружи. Вернее AOD тоже было во файловой системе но это была внутренняя "сборка", а не лежащий для сборки код. Самое практичное что-то типа Notepad++ для сравнения текстовых файлов. То что в AX2012 xpo, в AX7 это axpp. То есть экспортируем один и тот же проект с двух приложений и сравниваем как два текстовых файла. Так интереснее сравнивать не отдельные классы, а сразу много обьектов за раз. И без всяких возможных ошибок связанных с разрезами слоев и моделей. Эволюция файлы AOD -> база -> xml файлы довольно занятная. Сезон два "Долгий путь к Java" P.S. И показательна жизнь и смерть моделей в аксапте. Натуральный триллер. Скоро изобретут пространство вложенных "моделей" так чтобы полное имя совпадало с физическим файловым путем. Может назовут как нибудь хитро чтобы все прониклись. Последний раз редактировалось ax_mct; 07.10.2017 в 14:15. |
|
07.10.2017, 14:35 | #4 |
Banned
|
В принципе стандартный путь в секте BDSM это TFS
"compare files and folders across branches in Team Foundation Server" там где контекстное "Compare with baseline" не подходит. Но это совсем не KISS. Я бы выгружал в текст и сравнивал чем потупее. |
|
07.10.2017, 15:30 | #5 |
Участник
|
1.
как много и все не по делу. 2. разработчиков аксапты никто не просил класть именно в файлы. и уж точно никто не просил уменьшать функционал. они сделали так, как считали нужным для себя. но сделали так, что не работают ни старые аксаптовские инструменты, ни стандартные c#... 3. пока получается так, как на скриншоте ниже. пытаюсь отладить методику. 4. вопрос остается: можно ли получить свой исходный код из самой ax7? PS насколько же проще работать на ax2012. PSS и все таки, лучшей была ax2009 Последний раз редактировалось mazzy; 07.10.2017 в 15:35. |
|
07.10.2017, 17:16 | #6 |
Боец
|
Вероятно уже нельзя (без чтения XML, так или иначе).
Ранее AX сама компилировала код, вплоть до 2012. Сама генерила .net CIL. Для этого был нужен доступ и исходному коду изнутри. Сейчас, если я правильно понимаю архитектуру, то эти функции на себя взяла VS, работающая только с исходным XML и выдавая .net на выходе. Т.е., вероятно AX не в курсе своего исходного кода, который, по сути ей больше не нужен. (Функции, с run-time генерацией кода и его выполнением, как я понимаю больше не работают?). Да и исходный код более не привязан к конкретному методу. Сейчас, открывая код конкретного метода открывается полностью исходник всего обьекта - считай, голый текст. И пока он не скомпилится, по сути метода, как такового не существует. А все классы, методы и остальные артефакты АОТ - результат работы инструментария VS, на входе которого голый XML. Это размышления. Последний раз редактировалось DSPIC; 07.10.2017 в 17:25. |
|
|
За это сообщение автора поблагодарили: ax_mct (3), mazzy (2). |
07.10.2017, 17:38 | #7 |
Banned
|
В случае если под ax7 подразумевается ее обьектная модель, то для систем собирающих исполняемые сборки из редактируемого кода лежащего в файловой системе - это нелогично.
В случае если под ax7 подразумевается ее среда разработки, то это не только VS но и TFS. И если по их науке то TFS как раз для такого и предназначена если элементарное сравнение в VS не подходит. То что они будут рекомендовать сравнение выгруженных проектов в бесплатном текстовом редакторе - это нелогично, не их уровень. Прошу прощения за свою блондинкастую логику Я не задираюсь, я просто увлекаюсь |
|
|
За это сообщение автора поблагодарили: mazzy (2). |
07.10.2017, 22:18 | #8 |
Участник
|
Я бы тут заменил "Runtime" на "DesignTime" .
Код: var runtimeProviderConfiguration = New Microsoft.Dynamics.AX.Metadata.Storage.**Runtime.Runtime**ProviderConfiguration(packageDir); var metadataProviderFactory = New Microsoft.Dynamics.AX.Metadata.Storage.MetadataProviderFactory(); Microsoft.Dynamics.AX.Metadata.Providers.IMetadataProvider provider = metadataProviderFactory.Create**Runtime**Provider(runtimeProviderConfiguration); |
|
07.10.2017, 22:23 | #9 |
Участник
|
|
|
07.10.2017, 22:25 | #10 |
Участник
|
Они ж остались. Просто поверх них есть модули/пакеты.
Цитата:
Натуральный триллер.
Скоро изобретут пространство вложенных "моделей" так чтобы полное имя совпадало с физическим файловым путем. Может назовут как нибудь хитро чтобы все прониклись. |
|
08.10.2017, 03:54 | #11 |
Участник
|
Цитата:
почти 20 лет с ней живем, и нормально было. И тут бац! бац! http://axapta.mazzy.ru/lib/names/ зачем? да чтоб не геморроится с файлами тем, кто в ажуре работает. сомневаюсь. в c# мне еще предстоит освоить библиотеку, которая делает удобной работу с параметрами пользователя. пока на Powershell для ax7 и X++ для ax6 https://github.com/mazzy-ax/compare-axClass Последний раз редактировалось mazzy; 08.10.2017 в 03:57. |
|
|
За это сообщение автора поблагодарили: ax_mct (3). |
08.10.2017, 19:16 | #12 |
Участник
|
Ну это в мире X++ норма была. Остальной мир за это время вперед ушел.
Цитата:
зачем? да чтоб не геморроится с файлами тем, кто в ажуре работает.
Последний раз редактировалось belugin; 08.10.2017 в 19:18. |
|
17.10.2017, 23:16 | #13 |
Microsoft Dynamics
|
Разобрались с кодом или еще нет?
Я думаю, что нельзя получить искходный код в Ax7, потому что его там нет На Prod-е лежат только скомпилированные dll-ки. Там, в облаке, нет исходного кода. Соответственно получить его средствами x++, как было раньше, нельзя. Последний раз редактировалось AlexSD; 17.10.2017 в 23:18. |
|
17.10.2017, 23:44 | #14 |
Участник
|
Если хочешь спросить "решили ли задачу?"
Конечно же решили. Внешними средствами доступ к xml. Если хочешь спросить "есть ли ответ на тему ветки?" нет ответа нет. Цитата:
Однако в той конфигурации с которой работают внутри МС, исходный код есть. (см. скриншот) а раз программисты МС не перекладывают туда код руками, значит есть какая-то опция в установщике деплоере. отдельный вопрос - а синхронизируется ли этот код при обновлении. и вообще, вопросов - много. Опять же, не совсем так. Любой может открыть и посмотреть в класс SysModelMetaData на его метод init() и на его метод buildinitmethod() (см. скриншоты) Обсуждалось тут SMART TALKS 110: Metadata, abstract syntax tree and X++ best practice rules. Part 1 да, мы видим, что в buildinitmethod исходный код ЗАПИСЫВАЕТСЯ. но доступ к коду есть! в связи с этим вопрос - а только на запись доступ? или все-таки как-то прочитать можно? при каких условиях можно прочитать код из самой Аксапты? чуть выше Макс Белугин предложил использовать не Runtime объекты, а Designtime. но у меня сейчас руки не доходят проверить. если кому нужен пример кода для проверки, то код здесь https://gist.github.com/mazzy-ax/4d4...7527623467aee8 https://gist.github.com/mazzy-ax/292...fc753bfca9c529 попробуйте Designtime, пожалуйста |
|