Обнаружил странную вещь.
У нас на рабочей на части аосов отладка выключена, а на части включена.
Это приводит к неожиданным эффектам.
При старте аоса (SysCompileIL::synchronizeAssembly()) аксапта сравнивает файл записанный в sysXppAssembly с именем
X++:
sysXppAssembly.FileName == 'Dynamics.Ax.Application.dll'
и такой же из папки Xppil аоса (сравнивает хеши) и если отличаются, то выгружает из базы (из таблицы sysXppAssembly) все dll в папку Xppil.
Тут все нормально.
А дальше идет прикол.
В том же методе (SysCompileIL::synchronizeAssembly()) стоит вызов
X++:
// Disable jit if debugging is enabled on AOS
SysCompileIL::setDebuggingMode();
в котором
X++:
select firstOnly IsDebug from sysXppAssembly where sysXppAssembly.FileName == #XppDllName;
if (sysXppAssembly && sysXppAssembly.IsDebug != Debug::isDebugOnAOSEnabled())
{
...
Microsoft.Dynamics.Ax.Xpp.XppILGenerator::createManifestAssembly(#XppDllName, assemblyPath, AppVersion, Debug::isDebugOnAOSEnabled(), false);
...
SysCompileIL::uploadFiles(modifiedFiles, true, true);
...
}
т.е. она заново перегенерирует только одну Dynamics.Ax.Application.dll при этом признак отладки ставит в соответствие с настройками текущего аоса (!!!)
(конечно это будет только если настройка отладки на аосе отличается от настройки аоса, на котором собирали CIL)
Поэтому если рестартануть аос с ВКЛЮЧЕННОЙ отладкой то в sysXppAssembly для Dynamics.Ax.Application.dll будет создана запись с взведенным признаком isDebug и с dll в поле SysXppAssembly.File скомпилированной как отладочная.
А если рестартануть аос с ВЫКЛЮЧЕННОЙ отладкой, то в sysXppAssembly для Dynamics.Ax.Application.dll будет перезаписана запись со снятым признаком isDebug и с dll в поле SysXppAssembly.File скомпилированной как релизная.
При этом еще при рестарте в SysCompileIL::synchronizeAssembly() будут заново из базы закачаны все *.dll, *.netModule, *.pdb файлы, на что уйдет время (притом что изменялся только один dll файл)
По-моему тут какая-то ошибка.
Явно авторы закладывались на то что все аосы в кластере имеют одну и ту же настройку отладки.
На практике это не так. Хотя бы один отладочный аос все любят на рабочей держать.
Кто-нибудь разбирался с этой особенностью ?
От этого ничего не ломается ?
(легко получить, что часть компонентов сборки собрана c одним параметром отладки, а другая с другим)
Я думаю что как минимум надо держать в sysXppAssembly две записи для 'Dynamics.Ax.Application.dll' - отладочную и релизную и для выгрузки и сравнений выбирать одну из двух в соответствие с настройками аоса. Но тогда уж и остальной цил тоже надо в двух версиях держать.
Либо они принципиально не отличаются поэтому прокатит и так как сейчас и достаточно просто пофиксить сравнение, чтобы зря не выгружала файлы там, где в этом нет необходимости (оптимизируя тем самым время старта АОСа) ?