AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 31.10.2007, 14:03   #1  
pvito is offline
pvito
Участник
Аватар для pvito
 
9 / 10 (1) +
Регистрация: 14.04.2007
? Не создается экземпляр SysMailer в RunBaseBatch
Добрый день!

Может кто сталкивался с подобной проблемой.
AOS Application и Клиент - установлены на одной машине.
Пытаюсь создать экземпляр класса SysMailer в методе run в классе наследованом от RunBaseBatch
X++:
public void run()
{

 SysMailer mailer;
 ;
 
 mailer = new SysMailer();
 mailer.SMTPRelayServer("*****",25, "******", "*****", true);
 mailer.quickSend("***@***.**", "***@***.**", "test", "test");

}
Ставим задание на пакет.
Запускаем второго клиента.
Запускаем на втором клиенте пакетный обработчик.
При исполнении задания валится ошибка


Сбой запроса на разрешение типа "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();
(S)\Classes\BatchRun\runJobStatic - line 63
(S)\Classes\BatchRun\runJob - line 55
(S)\Classes\BatchRun\do - line 54
(C)\Forms\BatchRun\Methods\doBatch - line 18
(C)\Forms\BatchRun\Methods\setStart - line 8
(C)\Forms\BatchRun\Methods\setRunning - line 7
(S)\Classes\BatchRun\run - line 26
(C)\Classes\BatchRun\main - line 10

Если же запустить данный код просто в Job:

X++:
static void Job_test_SysMailer(Args _args)
{

 SysMailer mailer;
 ;
 
 mailer = new SysMailer();
 mailer.SMTPRelayServer("*****",25, "******", "*****", true);
 mailer.quickSend("***@***.**", "***@***.**", "test", "test");

}
То все выполняется нормально.

Заранее спасибо !

Последний раз редактировалось pvito; 31.10.2007 в 14:06.
Старый 31.10.2007, 18:29   #2  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 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.
Старый 01.11.2007, 06:02   #3  
pvito is offline
pvito
Участник
Аватар для pvito
 
9 / 10 (1) +
Регистрация: 14.04.2007
Спасибо огромное за помощь !!!
Старый 21.10.2011, 15:30   #4  
leva is offline
leva
Участник
 
52 / 36 (2) +++
Регистрация: 03.08.2005
Цитата:
Сообщение от gl00mie Посмотреть сообщение
К слову, о SysMailer: вроде в SP2 это исправили, но раньше в нем был один баг
Не знаю на каком этапе это появилось, я смотрю в AX2009, но кажется есть там ещё один баг.

Метод new в в SysMailer делает assert в начале, так что его как бы можно вызывать уже не делая это в своем коде. Только они забыли про параметр по-умолчанию.
X++:
void new(COM c = new COM('CDO.Message'))
{
    InteropPermission permission = new InteropPermission(InteropKind::ComInterop);
    ;
    permission.assert();
    //пропущено
}
Тут и происходит ошибка, если вызвать его из своего кода без параметров и предварительного assert-а.
Должно быть что-то вроде:
X++:
void new(COM c = null)
{
    InteropPermission permission = new InteropPermission(InteropKind::ComInterop);
    ;
    permission.assert();

    if (prmIsDefault(c))
        c = new COM('CDO.Message');
    //пропущено
}
За это сообщение автора поблагодарили: coolibin (1).
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
axaptapedia: RunBaseBatch Blog bot DAX Blogs 0 04.04.2009 22:05
axaptapedia: RunBaseBatch Blog bot DAX Blogs 0 31.03.2009 06:06
Не создается экземпляр MapIterator greench DAX: Программирование 13 30.10.2007 17:05
PatrickChua: Change the combobox options in RunbaseBatch class Blog bot DAX Blogs 0 28.10.2006 18:14
В потомке RunBaseBatch не создается файл DreamCreator DAX: Программирование 2 04.07.2005 12:08

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

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