Показать сообщение отдельно
Старый 14.02.2013, 09:42   #1  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
! Косяк в методе new() класса SysMailer
Всем доброго времени суток!
Наткнулся сегодня на очередной косяк в коде на слое SYS...
АХ 4.0 SP2, класс SysMailer метод new(). В этот метод параметром можно передать COM объект, и этот параметр заполняется по умолчанию...
X++:
void new(COM c = new COM('CDO.Message'))
{
    COM cdoConfig;
    InteropPermission permission = new InteropPermission(InteropKind::ComInterop);
    ;

    permission.assert();

    _COM = c;

    ....
}
Но permission.assert() выполняется уже в самом методе. В результате, если вдруг, класс SysMailer вызывается на сервере, то метод new() не отработает, и аксапта выведет ошибку: "Сбой запроса на разрешение типа "InteropPermission"." и соответственно "Объект "COM" не может быть создан"!
В итоге ошибка исправляется инициализацией по умолчанию COM класса значением null, а уже после выполнения permission.assert(); выполняем проверку переданного параметра и если он == null инициализируем его.
X++:
//void new(COM c = new COM('CDO.Message'))
void new(COM c = null) // до permission инициализируем значением null!
{
    COM cdoConfig;
    InteropPermission permission = new InteropPermission(InteropKind::ComInterop);
    ;

    permission.assert();
    // после того как получили разрешение проверяем параметр и при необходимости инициализируем его! -->
    if (!c)
        c = new COM('CDO.Message');
    // после того как получили разрешение проверяем параметр и при необходимости инициализируем его! <--
    _COM = c;

    ...
}
В таком виде все отрабатывает на ура!
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
За это сообщение автора поблагодарили: S.Kuskov (5).