AXForum  
Вернуться   AXForum > Блоги > Трудности перехода
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

Заметки об опыте перехода с Axapta 3.0 на AX 2009
Рейтинг: 3.67. Голосов: 3.

Типы X++ date/utcDateTime НЕ преобразуются автоматически в System.DateTime в .NET CIL

Запись от gl00mie размещена 17.01.2015 в 00:32
Обновил(-а) gl00mie 17.01.2015 в 00:36

Замечательная статья MSDN How to: Marshal Between X++ and CLR Primitive Types [AX 2012] утверждает следующее:
Цитата:
In Microsoft Dynamics AX, the X++ language does implicit conversion or marshaling between several X++ primitive types and their counterpart types managed by the common language runtime (CLR). This means that the X++ assignment operator, the single equal sign (=), can be used between certain pairings of an X++ type with a .NET Framework CLR type.
Среди поддерживаемых значится преобразование dateSystem.DateTime; на самом деле, в интерпретаторе X++, по крайней мере, в AX 2012 R2 и выше замечательно преобразуются и значения типов utcDateTimeSystem.DateTime! Но рассмотрим такой пример кода:
X++:
System.Web.HttpCookie   cookie  = new System.Web.HttpCookie('test');
date                    dateVar = today() + 1;
cookie.set_Expires(dateVar);
Всё хорошо, пока дело не доходит до выполнения в CIL - а тут нас поджидает System.NotSupportedException с сообщением вида
Цитата:
DateTimeConverter cannot convert from Microsoft.Dynamics.Ax.Xpp.AxShared.Date
либо
Цитата:
DateTimeConverter cannot convert from Microsoft.Dynamics.Ax.Xpp.AxShared.utcdatetime
если rvalue - типа utcDateTime. В чем же дело? А в том, что магия неявного преобразования типов работает только в интерпретаторе байт-кода X++, а в CIL все происходит иначе, поэтому если есть хотя бы нановероятность того, что подобный ваш код будет выполняться в CIL, всегда выполняйте явное преобразование типов вида:
X++:
cookie.set_Expires(CLRInterop::getObjectForAnyType(dateVar));
Размещено в Без категории
Просмотров 117278 Комментарии 3
Всего комментариев 3

Комментарии

  1. Старый комментарий
    Аватар для b_nosoff
    Как раз в указанной статье есть Note: There is no implicit marshaling between the X++ utcdatetime and .NET Framework System.DateTime type. For more information about how to convert between utcdatetime and System.DateTime, see How to: Convert Between utcdatetime and System.DateTime.

    А уже по ссылке упомянуты два специальных метода в Global
    X++:
    Global::utcDateTime2SystemDateTime
    Global::CLRSystemDateTime2UtcDateTime
    И что самое интересное - похоже, что в каком-то из последних билдов R2 приведение типов пофиксили, и сейчас с этим нет проблем, по крайней мере, в билде 6.2.1000.9323.
    Запись от b_nosoff размещена 19.01.2015 в 12:52 b_nosoff is offline
    Обновил(-а) b_nosoff 19.01.2015 в 13:23
  2. Старый комментарий
    Спасибо, я тоже читал примечание и ссылки на методы Global, но тут речь не об этом. В статье MSDN говорится, что есть автоматическое преобразование для типа date, но нет автоматического преобразования для utcDateTime. По факту же получается немного иначе: есть автоматическое преобразование и для date, и для utcDateTime (как минимум в R2) - но только при работе в интерпретаторе байт-кода X++, а при работе в CIL нет автоматического преобразования ни для date, ни для utcDateTime.
    Запись от gl00mie размещена 19.01.2015 в 13:28 gl00mie is offline
  3. Старый комментарий
    Аватар для b_nosoff
    В том-то и дело, что в билде 6.2.1000.9323 неявное приведение работает в том числе и в CIL.
    Запись от b_nosoff размещена 19.01.2015 в 14:26 b_nosoff is offline
 


Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 16:09.