Показать сообщение отдельно
Старый 31.10.2007, 18:29   #2  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5788 (200) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от pvito Посмотреть сообщение
Пытаюсь создать экземпляр класса SysMailer в методе run в классе наследованом от RunBaseBatch. При исполнении задания валится ошибка
Сбой запроса на разрешение типа "InteropPermission".
(S)\Classes\InteropPermission\demand
(S)\Classes\COM\new
(S)\Classes\SysMailer\new - line 1
(S)\Classes\NAT_T2MailSender\run - line 7 - здесь mailer = new SysMailer();
Если же запустить данный код просто в Job то все выполняется нормально.
Есть чудесный документ Writing Secure X++ Code, где рассказывается, как в 4-ке ввели ограничения на выполнение unmanaged code, и как с этими ограничениями жить. Смысл в том, что когда код выполняется на сервере (как происходит, судя по приведенному стеку вызовов, в случае с пакетным заданием), то для использования ряда возможностей, вроде DLLFunction, COM-объектов и т.п. необходимо явно проверять (запрашивать) наличие разрешений на это. Когда же код (Job, к примеру) выполняется на клиенте, Аксапте на такие вещи наплевать. В приведенном случае класс SysMailer пытается создать экземляр COM-объекта, так что код работы с ним необходимо обрамить примерно так:
X++:
InteropPermission comPermission = new InteropPermission(InteropKind::ComInterop);
SysMailer         mailer;
;
comPermission.assert();
mailer = new SysMailer();
// ... работа с SysMailer...
CodeAccessPermission::revertAssert();  // опционально, но явный вызов - это теперь тоже Best Practices
PS. К слову, о SysMailer: вроде в SP2 это исправили, но раньше в нем был один баг

Последний раз редактировалось gl00mie; 31.10.2007 в 18:39.