31.10.2007, 18:29
|
#2
|
Участник
Регистрация: 28.11.2005
Адрес: Москва
|
Цитата:
Сообщение от 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.
|
|