| 
			
			 | 
		#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 | 
| 
	
 |