![]() |
#1 |
Участник
|
Через 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; } ![]() P.S.: На удачу вместо System.String[] попробовал вернуть аксаптовский Array(Types::String). Заработало ![]() А по поводу чудесного преобразования аксаптовского Array в System.String[] интересно узнать. Эта возможность где-то документированна или пользоваться этим можно только на свой страх и риск? Последний раз редактировалось S.Kuskov; 07.07.2011 в 15:03. |
|
![]() |
#2 |
Участник
|
Все массивы в CLR унаследованы от System.Array. Тут об этом пишут. Тоже сталкивался с подобной ситуацией, вышел так же - возвращал Array. Работает нормально, т.к. возвращается тип базового класса. Мне кажется, просто в AX не все синтаксические конструкции типа [] или <> поддерживаются.
|
|
|
За это сообщение автора поблагодарили: Logger (3), S.Kuskov (3). |
![]() |
#3 |
Участник
|
Цитата:
![]() |
|
![]() |
#4 |
Участник
|
Цитата:
|
|
![]() |
#5 |
Участник
|
У меня на стороне аксапты всё компилируется и если смотреть дебагером объект вроде-как создаётся и возвращается. Но в Net его значение превращается в NULL
![]() |
|
![]() |
#6 |
Участник
|
Отладчик VS показывает, что не получится. Создал в AX статический метод.
X++: public static System.String test() { System.String s; ; s = "ax string"; return s; } |
|
![]() |
#7 |
Участник
|
Подтверждение тому, что CLR объекты нельзя передавать между клиентом и AOS можно найти на этой странице. На передачу объектов между приложениями похоже это тоже распространяется.
Цитата:
.NET Framework objects cannot be serialized and de-serialized by Microsoft Dynamics AX.
Последний раз редактировалось _scorp_; 07.07.2011 в 17:37. |
|
|
За это сообщение автора поблагодарили: S.Kuskov (5). |
![]() |
#8 |
Участник
|
Нет, тут как раз таки проблема при передаче с сервера на клиента (в исходном вопросе S.Kuskov вызывается статический метод на сервере) - бизнесконнектор ведь на клиенте.
А в вашем примере, на VS не надо приводить к AxaptaObject, т.е надо так X++: Object obj; ... obj = ax.CallStaticClassMethod("TestAX", "test");
__________________
Axapta v.3.0 sp5 kr2 |
|
|
За это сообщение автора поблагодарили: S.Kuskov (5). |
![]() |
#9 |
Участник
|
Когда я начал тестировать возможности CallStaticClassMethod, у меня возникли проблемы с вызовом методов, находящихся на клиенте (коннектор ругался на то что у него нет прав), серверные методы вызывались же без проблем.
Может кто-то знает что нужно донастроить, какие права раздать, для того чтобы можно было через коннектор вызывать методы находящиеся на клиенте? Или проблему искать в самом клиенте? |
|
![]() |
#10 |
Участник
|
Цитата:
Вот класс в 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; } Цитата:
|
|
|
За это сообщение автора поблагодарили: player (1). |
![]() |
#11 |
Участник
|
Как клиентский и серверный, у вас помечены методы, возвращающие 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 |
|
![]() |
#12 |
Участник
|
Цитата:
![]() |
|
![]() |
#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(); Последний раз редактировалось b_nosoff; 09.07.2011 в 20:30. |
|
|
За это сообщение автора поблагодарили: Logger (3), S.Kuskov (3). |
Теги |
business connector, client, server |
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|