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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 07.07.2011, 14:47   #1  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Через NetBusinessConnector получить CLRObject, созданный в Аксапте
Можно ли через NetBusinessConnector получить CLRObject, созданный в Аксапте?
Пишу:
X++:
static server System.String[] getTestArray()
{
    System.String[] strs;
    InteropPermission perm;
    ;

    perm = new InteropPermission(InteropKind::ClrInterop);
    perm.assert();

    strs = new System.String[3]();

    strs.SetValue("AAA", 0);
    strs.SetValue("BBB", 1);
    strs.SetValue("CCC", 2);

    CodeAccessPermission::revertAssert();

    return strs;
}
Возвращается Null

P.S.: На удачу вместо System.String[] попробовал вернуть аксаптовский Array(Types::String). Заработало Но вопрос о возврате именно CLRObject остался.
А по поводу чудесного преобразования аксаптовского Array в System.String[] интересно узнать. Эта возможность где-то документированна или пользоваться этим можно только на свой страх и риск?

Последний раз редактировалось S.Kuskov; 07.07.2011 в 15:03.
Старый 07.07.2011, 15:25   #2  
_scorp_ is offline
_scorp_
Участник
Аватар для _scorp_
MCBMSS
 
488 / 369 (13) ++++++
Регистрация: 25.07.2007
Адрес: Москва
Все массивы в CLR унаследованы от System.Array. Тут об этом пишут. Тоже сталкивался с подобной ситуацией, вышел так же - возвращал Array. Работает нормально, т.к. возвращается тип базового класса. Мне кажется, просто в AX не все синтаксические конструкции типа [] или <> поддерживаются.
За это сообщение автора поблагодарили: Logger (3), S.Kuskov (3).
Старый 07.07.2011, 15:30   #3  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от _scorp_ Посмотреть сообщение
Мне кажется, просто в AX не все синтаксические конструкции типа [] или <> поддерживаются.
Если абстрагироваться от масивов и шаблонов и попробовать вернуть, ну скажем просто System.String. Получится? У меня не получается , в то же время аксаптовский str отрабатывает на ура. Может это я что-то не так делаю, или такая проблема действительно есть?
Старый 07.07.2011, 15:32   #4  
_scorp_ is offline
_scorp_
Участник
Аватар для _scorp_
MCBMSS
 
488 / 369 (13) ++++++
Регистрация: 25.07.2007
Адрес: Москва
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Если абстрагироваться от масивов и шаблонов и попробовать вернуть, ну скажем просто System.String. Получится? У меня не получается , в то же время аксаптовский str отрабатывает на ура. Может это я что-то не так делаю, или такая проблема действительно есть?
Может в этом дело?
Старый 07.07.2011, 15:36   #5  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
У меня на стороне аксапты всё компилируется и если смотреть дебагером объект вроде-как создаётся и возвращается. Но в Net его значение превращается в NULL
Старый 07.07.2011, 16:29   #6  
_scorp_ is offline
_scorp_
Участник
Аватар для _scorp_
MCBMSS
 
488 / 369 (13) ++++++
Регистрация: 25.07.2007
Адрес: Москва
Отладчик VS показывает, что не получится. Создал в AX статический метод.
X++:
public static System.String test()
{
    System.String s;
    ;
    s = "ax string";
    return s;
}
Посмотрел в VS отладчике что там вообще возвращается. Ничего похожего на правду не увидел.
Нажмите на изображение для увеличения
Название: 1.JPG
Просмотров: 465
Размер:	103.1 Кб
ID:	6986
Старый 07.07.2011, 17:35   #7  
_scorp_ is offline
_scorp_
Участник
Аватар для _scorp_
MCBMSS
 
488 / 369 (13) ++++++
Регистрация: 25.07.2007
Адрес: Москва
Подтверждение тому, что CLR объекты нельзя передавать между клиентом и AOS можно найти на этой странице. На передачу объектов между приложениями похоже это тоже распространяется.
Цитата:
.NET Framework objects cannot be serialized and de-serialized by Microsoft Dynamics AX.

Последний раз редактировалось _scorp_; 07.07.2011 в 17:37.
За это сообщение автора поблагодарили: S.Kuskov (5).
Старый 07.07.2011, 22:00   #8  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Нет, тут как раз таки проблема при передаче с сервера на клиента (в исходном вопросе S.Kuskov вызывается статический метод на сервере) - бизнесконнектор ведь на клиенте.

А в вашем примере, на VS не надо приводить к AxaptaObject, т.е надо так
X++:
Object obj;
...
obj = ax.CallStaticClassMethod("TestAX", "test");
В общем, если экземпляр создается на клиенте - его вполне можно передать через бизнесконнектор, в том числе массив
__________________
Axapta v.3.0 sp5 kr2
За это сообщение автора поблагодарили: S.Kuskov (5).
Старый 08.07.2011, 07:52   #9  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Когда я начал тестировать возможности CallStaticClassMethod, у меня возникли проблемы с вызовом методов, находящихся на клиенте (коннектор ругался на то что у него нет прав), серверные методы вызывались же без проблем.

Может кто-то знает что нужно донастроить, какие права раздать, для того чтобы можно было через коннектор вызывать методы находящиеся на клиенте? Или проблему искать в самом клиенте?
Старый 08.07.2011, 09:39   #10  
_scorp_ is offline
_scorp_
Участник
Аватар для _scorp_
MCBMSS
 
488 / 369 (13) ++++++
Регистрация: 25.07.2007
Адрес: Москва
Цитата:
Сообщение от AndyD Посмотреть сообщение
Нет, тут как раз таки проблема при передаче с сервера на клиента (в исходном вопросе S.Kuskov вызывается статический метод на сервере) - бизнесконнектор ведь на клиенте.
У меня все работает. Хоть клиентский метод вызывать, хоть серверный.
Вот класс в AX
X++:
class TestAX
{
}
public static server str testServer()
{
    ;
    return "server AX string";
}
public static client str testClient()
{
    ;
    return "client AX string";
}
public static System.String test()
{
    System.String s;
    ;
    s = "CLR AX string";
    return s;
}
Вызов из CLR работает нормально.

Цитата:
Сообщение от AndyD Посмотреть сообщение
А в вашем примере, на VS не надо приводить к AxaptaObject, т.е надо так
X++:
Object obj;
...
obj = ax.CallStaticClassMethod("TestAX", "test");
В общем, если экземпляр создается на клиенте - его вполне можно передать через бизнесконнектор, в том числе массив
Я не случайно приводил к AxaptaObject. Дело в том, что именно этот тип и возвращается, а если конкретнее, то аксаптовский класс CLRObgect, который находится в ветке SystemDocumentation / Classes. Убедится в этом можно так:
Нажмите на изображение для увеличения
Название: 1.JPG
Просмотров: 437
Размер:	64.5 Кб
ID:	6987
За это сообщение автора поблагодарили: player (1).
Старый 08.07.2011, 13:15   #11  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Как клиентский и серверный, у вас помечены методы, возвращающие str - Аксаптовский тип.

Вы попробуйте вернуть с сервера System.String - у меня на SP1 RU7 вылетает исключение, у S.Kuskov - возвращается null

Что же касается последней части - преобразования Object к AxaptaObject, то у меня в рантайме вылетает эксепшен, о невозможности приведения типов System.String к AxaptaObject (и для такого вызова тоже AxaptaObject obj = (AxaptaObject) Axapta.CallStaticMethod()).
Проверял на чистой установке DAX2009 (без SP1 и обновлений), вместе с SP1 только и с RU7, во всех трех случаях - поведение одинаковое
__________________
Axapta v.3.0 sp5 kr2
Старый 08.07.2011, 15:01   #12  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Когда я начал тестировать возможности CallStaticClassMethod, у меня возникли проблемы с вызовом методов, находящихся на клиенте (коннектор ругался на то что у него нет прав), серверные методы вызывались же без проблем.
Я как то упустил из виду то что на клиентской машине не был установлен клиент Аксапты, проинсталирован был только сам BusinessConnector. Установил, клиентские методы стали работать без проблем. Теперь сижу удивляюсь как там вообще что-то работало
Старый 09.07.2011, 20:20   #13  
b_nosoff is offline
b_nosoff
Читатель
Аватар для b_nosoff
MCP
MCBMSS
 
197 / 143 (5) +++++
Регистрация: 01.12.2004
Адрес: Msk
Записей в блоге: 13
Единственное, что было странным при установке только BusinessConnector, так это отсутствие библиотек, которые вроде бы должны там быть)) В остальном ничего не мешало запускать код на стороне клиента.
А сериализовать и десериализовать объекты CLR в Аксапте можно и самостоятельно.

UPD: собственно, пример. Вдруг кто не знает как это делается))
X++:
    System.Xml.Serialization.XmlSerializer  serializer;
    System.IO.StringWriter                  xml;
    ;

    xml = new ClrObject("System.IO.StringWriter", new System.Text.StringBuilder());

    serializer = new clrObject("System.Xml.Serialization.XmlSerializer", terminalData.GetType());

    serializer.Serialize(xml, terminalData);

    result = xml.ToString();
где terminalData - сериализуемый объект
__________________
Axapta non erubescit

Последний раз редактировалось b_nosoff; 09.07.2011 в 20:30.
За это сообщение автора поблагодарили: Logger (3), S.Kuskov (3).
Теги
business connector, client, server

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Запуск программы из Аксапты через 2-хзвенку Migel_84 DAX: Программирование 25 27.04.2006 09:41
Система оповещений в Аксапте (события в Аксапте) raunio DAX: Прочие вопросы 1 29.09.2005 15:44
Размышления на тему “Системы контроля версий в Аксапте”. Андре DAX: База знаний и проекты 31 07.02.2005 12:29
Чтение Excel-ячейки в Аксапте (2.5) через COM AKIS DAX: Программирование 3 25.03.2004 20:18
Скорость в Аксапте Алексей Контев DAX: Прочие вопросы 13 25.06.2002 14:37

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

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

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