Всем доброго времени суток!
Наткнулся сегодня на очередной косяк в коде на слое 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;
...
}
В таком виде все отрабатывает на ура!