07.07.2011, 14:47 | #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). Заработало Но вопрос о возврате именно CLRObject остался. А по поводу чудесного преобразования аксаптовского Array в System.String[] интересно узнать. Эта возможность где-то документированна или пользоваться этим можно только на свой страх и риск? Последний раз редактировалось S.Kuskov; 07.07.2011 в 15:03. |
|
07.07.2011, 15:25 | #2 |
Участник
|
Все массивы в CLR унаследованы от System.Array. Тут об этом пишут. Тоже сталкивался с подобной ситуацией, вышел так же - возвращал Array. Работает нормально, т.к. возвращается тип базового класса. Мне кажется, просто в AX не все синтаксические конструкции типа [] или <> поддерживаются.
|
|
|
За это сообщение автора поблагодарили: Logger (3), S.Kuskov (3). |
07.07.2011, 15:30 | #3 |
Участник
|
Если абстрагироваться от масивов и шаблонов и попробовать вернуть, ну скажем просто System.String. Получится? У меня не получается , в то же время аксаптовский str отрабатывает на ура. Может это я что-то не так делаю, или такая проблема действительно есть?
|
|
07.07.2011, 15:32 | #4 |
Участник
|
Цитата:
|
|
07.07.2011, 15:36 | #5 |
Участник
|
У меня на стороне аксапты всё компилируется и если смотреть дебагером объект вроде-как создаётся и возвращается. Но в Net его значение превращается в NULL
|
|
07.07.2011, 16:29 | #6 |
Участник
|
Отладчик VS показывает, что не получится. Создал в AX статический метод.
X++: public static System.String test() { System.String s; ; s = "ax string"; return s; } |
|
07.07.2011, 17:35 | #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). |
07.07.2011, 22:00 | #8 |
Участник
|
Нет, тут как раз таки проблема при передаче с сервера на клиента (в исходном вопросе 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 |
Участник
|
Когда я начал тестировать возможности CallStaticClassMethod, у меня возникли проблемы с вызовом методов, находящихся на клиенте (коннектор ругался на то что у него нет прав), серверные методы вызывались же без проблем.
Может кто-то знает что нужно донастроить, какие права раздать, для того чтобы можно было через коннектор вызывать методы находящиеся на клиенте? Или проблему искать в самом клиенте? |
|
08.07.2011, 09:39 | #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). |
08.07.2011, 13:15 | #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 |
|
08.07.2011, 15:01 | #12 |
Участник
|
Я как то упустил из виду то что на клиентской машине не был установлен клиент Аксапты, проинсталирован был только сам BusinessConnector. Установил, клиентские методы стали работать без проблем. Теперь сижу удивляюсь как там вообще что-то работало
|
|
09.07.2011, 20:20 | #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). |