22.03.2006, 13:22 | #1 |
Moderator
|
Объект, как параметр COM-метода
Добрый день, гуру.
Возможно ли возвращать объект, как параметр метода, через COM-коннектор? Есть идея написать небольшую утилиту; причем логику хочется реализовать на X++, а интерфейс на С#. При таком подходе я не привязываюсь к структуре таблиц, которая может измениться при переходе на новую версию. Кроме того, в будущем я легко смогу сделать интерфейсную часть на web (например, Perl). При проектировании этой утилиты возникла потребность в классе X++, который хранил бы коллекцию записей и реализовывал бы пару методов: int getRecordCount(), MyObject getMyObjectByNum(int _num). Соответсвенно возникает вопрос - смогу ли я дернуть второй метод (getMyObjectByNum через COM), получить на клиенте (С#) объект MyObject (по сути его реализация на X++) и поработать с его методами из С#-программы? Заранее спасибо. |
|
22.03.2006, 14:19 | #2 |
Microsoft Dynamics
|
Вот что об этом сказано в Писании:
The IAxaptaObject interface derives from IDispatch, and provides methods for calling methods of Microsoft Axapta objects. The IAxaptaObject interface is a dual interface, and objects can be created using IAxapta::CreateObject or IAxapta::CreateObjectEx only. И здесь же пример использования из приложения на VB: Код: Dim Axapta As Object Dim MyObject As Object Set Axapta = CreateObject("AxaptaCOMConnector.Axapta") Axapta.Logon ‘ create an Axapta object Set MyObject = Axapta.CreateObject("MyClass", "new parameter1", 2) ‘ we can now call methods of "MyObject" using its "Call" method MyObject.Call "MyMethod", "parameter1", 2 |
|
22.03.2006, 14:26 | #3 |
Moderator
|
Спасибо.
Интересует возможность примерно следующего: MyObject.Call "MyMethod", "parameter1", MyObject То есть, маршалинг объектов между аксаптой и X++. Причем как X++ объектов, так и системных. |
|
22.03.2006, 15:04 | #4 |
Участник
|
не получится. с колбеками в аксапте туго
|
|
22.03.2006, 15:30 | #5 |
Microsoft Dynamics
|
Цитата:
Сообщение от belugin
не получится. с колбеками в аксапте туго
Что касается передачи ссылки на объект X++ в модуль на C#, допустим, технически это возможно, но дальше-то что? Для модуля C# ссылка на объект X++ это ссылка на некую структуру в памяти, о которой C# не имеет ни малейшего представления и уж точно не сможет выполнить метод класса X++ самостоятельно. Выполнение метода класса X++ возможно только через Axapta COM Connector. Не совсем понятна постановка задачи... |
|
22.03.2006, 15:47 | #6 |
Moderator
|
Цитата:
Для модуля C# ссылка на объект X++ это ссылка на некую структуру в памяти,
Цитата:
о которой C# не имеет ни малейшего представления и уж точно не сможет выполнить метод класса X++ самостоятельно.
Соответсвенно программа на C# зная идентификатор COM-объекта, смогла бы получить COM-интерфейс, который реализуется моим COM-объектом. Аксапта же не регистрирует в системе свои объекты, как COM-объекты. Хотя я наверное COM совсем забыл |
|
22.03.2006, 16:32 | #7 |
Microsoft Dynamics
|
Вот именно, объекты Аксапты не зарегистрированы в операционной системе как самостоятельные сущности. Они существуют только внутри Аксапты и могут вызываться только самой Аксаптой, т.к. скомпилированы не в универсальный managed code в терминах платформы .NET, а в некий псевдо- байт-код, выполнение которого возможно только ядром Аксапты.
|
|
22.03.2006, 16:43 | #8 |
Moderator
|
Цитата:
Вот именно, объекты Аксапты не зарегистрированы в операционной системе как самостоятельные сущности. Они существуют только внутри Аксапты и могут вызываться только самой Аксаптой
Цитата:
т.к. скомпилированы не в универсальный managed code в терминах платформы .NET
|
|
22.03.2006, 17:06 | #9 |
Banned
|
А я бы решил эту задачу так: класс Аксапта getMyObjectByNum() возвращал бы строку - элемент XML, который разбирается Вашим внешним COM-компонентом. В этом случае вы не так зависите от структуры таблицы, можете добавлять и удалять поля из элемента.
|
|
|
За это сообщение автора поблагодарили: Андре (4). |
22.03.2006, 17:12 | #10 |
Moderator
|
EVGL, спасибо.
В данной ситуации очень удачный вариант. Хотя я теряю возможность вызывать методы объекта (те самые callback вызовы, про которые писал belugin), я хотя бы могу получить набор сложно-структурированной информации. Еще раз спасибо. Жаль только что сам до этого не дошел - похоже год работы консультантом дает о себе знать |
|
22.03.2006, 18:21 | #11 |
Участник
|
еще можно вести некий список созданных в C# объектов (можно использовать, например Scripting.Dictionary), который передавать в аксапту например, через Running Objects Table или сделать его Singleton'ом, запоминать там в SysGlobalCache
Перед тем как передавать объект в аксапту, запихивать в список на стороне C# после чего извлекать из списка на стороне Axapta и передавать в качестве параметра методу. то есть будет что-то типа Код: Dim Axapta As Object Dim MyObject As Object Set Axapta = CreateObject("AxaptaCOMConnector.Axapta") Dim myRegistry as new Registry Axapta.Logon ‘ create an Axapta object Dim secondObject as New MyClass Dim index as Int index=myRegistry.register(secondObject) Dim secondObjectWrapper as Object ' вызвать статический метод для получения обертки объекта аксапты передав ему index в реестре объектов secondObjectWrapper = Axapta.CallStaticMethon "Regiserty", index ‘ Передать обертку внктрь аксапты MyObject.Call "MyMethod", "parameter1", secondObjectWrapper |
|