|
|
#1 |
|
Moderator
|
Объект, как параметр COM-метода
Добрый день, гуру.
Возможно ли возвращать объект, как параметр метода, через COM-коннектор? Есть идея написать небольшую утилиту; причем логику хочется реализовать на X++, а интерфейс на С#. При таком подходе я не привязываюсь к структуре таблиц, которая может измениться при переходе на новую версию. Кроме того, в будущем я легко смогу сделать интерфейсную часть на web (например, Perl). При проектировании этой утилиты возникла потребность в классе X++, который хранил бы коллекцию записей и реализовывал бы пару методов: int getRecordCount(), MyObject getMyObjectByNum(int _num). Соответсвенно возникает вопрос - смогу ли я дернуть второй метод (getMyObjectByNum через COM), получить на клиенте (С#) объект MyObject (по сути его реализация на X++) и поработать с его методами из С#-программы? Заранее спасибо. |
|
|
|
|
#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 |
|
|
|
|
#3 |
|
Moderator
|
Спасибо.
Интересует возможность примерно следующего: MyObject.Call "MyMethod", "parameter1", MyObject То есть, маршалинг объектов между аксаптой и X++. Причем как X++ объектов, так и системных. |
|
|
|
|
#4 |
|
Участник
|
не получится. с колбеками в аксапте туго
|
|
|
|
|
#5 |
|
Microsoft Dynamics
|
Цитата:
Сообщение от belugin
не получится. с колбеками в аксапте туго
Что касается передачи ссылки на объект X++ в модуль на C#, допустим, технически это возможно, но дальше-то что? Для модуля C# ссылка на объект X++ это ссылка на некую структуру в памяти, о которой C# не имеет ни малейшего представления и уж точно не сможет выполнить метод класса X++ самостоятельно. Выполнение метода класса X++ возможно только через Axapta COM Connector. Не совсем понятна постановка задачи... |
|
|
|
|
#6 |
|
Moderator
|
Цитата:
Для модуля C# ссылка на объект X++ это ссылка на некую структуру в памяти,
Цитата:
о которой C# не имеет ни малейшего представления и уж точно не сможет выполнить метод класса X++ самостоятельно.
Соответсвенно программа на C# зная идентификатор COM-объекта, смогла бы получить COM-интерфейс, который реализуется моим COM-объектом. Аксапта же не регистрирует в системе свои объекты, как COM-объекты. Хотя я наверное COM совсем забыл
|
|
|
|
|
#7 |
|
Microsoft Dynamics
|
Вот именно, объекты Аксапты не зарегистрированы в операционной системе как самостоятельные сущности. Они существуют только внутри Аксапты и могут вызываться только самой Аксаптой, т.к. скомпилированы не в универсальный managed code в терминах платформы .NET, а в некий псевдо- байт-код, выполнение которого возможно только ядром Аксапты.
|
|
|
|
|
#8 |
|
Moderator
|
Цитата:
Вот именно, объекты Аксапты не зарегистрированы в операционной системе как самостоятельные сущности. Они существуют только внутри Аксапты и могут вызываться только самой Аксаптой
Цитата:
т.к. скомпилированы не в универсальный managed code в терминах платформы .NET
|
|
|
|
|
#9 |
|
Banned
|
А я бы решил эту задачу так: класс Аксапта getMyObjectByNum() возвращал бы строку - элемент XML, который разбирается Вашим внешним COM-компонентом. В этом случае вы не так зависите от структуры таблицы, можете добавлять и удалять поля из элемента.
|
|
|
|
| За это сообщение автора поблагодарили: Андре (4). | |
|
|
#10 |
|
Moderator
|
EVGL, спасибо.
В данной ситуации очень удачный вариант. Хотя я теряю возможность вызывать методы объекта (те самые callback вызовы, про которые писал belugin), я хотя бы могу получить набор сложно-структурированной информации. Еще раз спасибо. Жаль только что сам до этого не дошел - похоже год работы консультантом дает о себе знать
|
|
|
|
|
#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 |
|
|