Почему AutoCAD не видит методы и свойства COM сервера?
Реклама i
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Почему AutoCAD не видит методы и свойства COM сервера?

Почему AutoCAD не видит методы и свойства COM сервера?

Ответ
Поиск в этой теме
Непрочитано 28.03.2011, 01:27 #1
Почему AutoCAD не видит методы и свойства COM сервера?
nikе
 
конструктор Лего
 
Краснодар
Регистрация: 21.10.2005
Сообщений: 205

Сделал я COM сервер на C#.
Проверил его работу через VB script. Метод запустился успешно:
Dim Orbit
Set Orbit = CreateObject("ComNet.TestComponent")
Orbit.About

Потом в Bricscad 10 попробовал:
(setq ObjComNet (vlax-create-object "ComNet.TestComponent"))
(vlax-invoke-method ObjComNet 'About) - тоже на ура все работало.

А вот почему-то в AutoCAD (ну и в Gstarcad) vla-объект образуется, но приложение не видит его методов и свойств. Сталкивался кто с таким нежеланием честно работать с NET COM сервером?????? Есть ли решение этой проблемы?
Просмотров: 7109
 
Непрочитано 28.03.2011, 10:29
#2
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Попробуй имя метода взять в кавычки
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 28.03.2011, 10:37
#3
nikе

конструктор Лего
 
Регистрация: 21.10.2005
Краснодар
Сообщений: 205


C кавычками тоже пробовал, выдает "неправильный аргумент".
(vlax-invoke-method ObjComNet "About")
Может быть это особенность AutoCAD - не работать с ненативными серверами?
nikе вне форума  
 
Непрочитано 28.03.2011, 11:52
#4
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


а что нам скажет (vlax-dump-object ObjComNet T)
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 28.03.2011, 13:03
#5
nikе

конструктор Лего
 
Регистрация: 21.10.2005
Краснодар
Сообщений: 205


(vlax-dump-object ObjComNet T) - покажет нам пустые методы и свойства, т.е. их нет, даже не нули.
В Bricscad тоже оно показывает, что свойств и методов нет, однако он их запускает, так же как и VB script...
nikе вне форума  
 
Непрочитано 28.03.2011, 13:42
#6
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


А почему их нет? About это что?
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 28.03.2011, 21:09
#7
nikе

конструктор Лего
 
Регистрация: 21.10.2005
Краснодар
Сообщений: 205


Я пришел домой и выполнил тест еще раз
Результаты в Bricscad 10:

: (setq ObjComNet (vlax-create-object "ComNet.TestComponent"))
#<VLA-OBJECT _TestComponent 0315002c>
: (vlax-invoke-method ObjComNet 'About)
"This component wrote on C#"
: (vlax-dump-object ObjComNet T)

; _TestComponent 0315002c : (null)
;
; Property values :
;
;
; Methods supported :
;
T

результаты в AutoCAD 2011:
Команда: (setq ObjComNet (vlax-create-object "ComNet.TestComponent"))
#<VLA-OBJECT _TestComponent 0b2df3ec>

Команда: (vlax-invoke-method ObjComNet 'About)
; ошибка: элемент не найден: ABOUT

Команда: (vlax-dump-object ObjComNet T)
; _TestComponent: nil
; Нет свойств
; Нет методов
T


->А.Ривилис
метод About возвращает строку "This component wrote on C#"
nikе вне форума  
 
Непрочитано 29.03.2011, 13:25
#8
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Думаю, что без исходника здесь не разобраться.

P.S.: Кстати попробуй вместо:
Код:
[Выделить все]
(vlax-invoke-method ObjComNet 'About)
использовать
Код:
[Выделить все]
(vlax-invoke ObjComNet 'About)

Последний раз редактировалось Александр Ривилис, 29.03.2011 в 15:22.
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 29.03.2011, 17:15
#9
nikе

конструктор Лего
 
Регистрация: 21.10.2005
Краснодар
Сообщений: 205


СПАСИБО!!!! Александр Ривилис!!!
Ура! Работает!!!
(vlax-invoke ObjComNet 'About)
nikе вне форума  
 
Непрочитано 29.03.2011, 17:29
#10
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от nikе Посмотреть сообщение
СПАСИБО!!!! Александр Ривилис!!!
Ура! Работает!!!
(vlax-invoke ObjComNet 'About)
Теперь бы еще понять чего не хватает для того, чтобы (vlax-dump-object ObjComNet T) возвращал свойства и методы объекта.
Александр Ривилис вне форума  
 
Непрочитано 29.03.2011, 19:01
#11
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


http://www.compress.ru/article.aspx?...rt=index21ext1

Цитата:
...DualInterfaces
Идея двойных интерфейсов очень проста. Сервер реализует одновременно некоторый интерфейс, оформленный по стандартам COM (VTable), идиспинтерфейс, доступный через IDispatch. При этом интерфейс VTable должен быть унаследован от IDispatch и иметь идентичный с диспинтерфейсом набор методов. Такое оформление сервера позволяет клиентам работать с ним наиболее удобным для каждого клиента образом.

Клиенты, использующие VTable, вызывают методы интерфейса напрямую, а клиенты, использующие позднее связывание, — через методы IDispatch.

Большинство OLE-серверов реализуют двойной интерфейс.

...
Supermax вне форума  
 
Автор темы   Непрочитано 29.03.2011, 22:23
#12
nikе

конструктор Лего
 
Регистрация: 21.10.2005
Краснодар
Сообщений: 205


Прилагаю исходник COM сервера:
Вложения
Тип файла: zip ComNet.zip (7.6 Кб, 64 просмотров)
nikе вне форума  
 
Непрочитано 30.03.2011, 16:35
1 | #13
Pastor

это только кличка
 
Регистрация: 22.10.2006
Москва
Сообщений: 252


1. По поводу
Цитата:
Команда: (vlax-invoke-method ObjComNet 'About)
; ошибка: элемент не найден: ABOUT
У тебя About - это свойство. А ты пытаешься вызвать его как метод.
Нужно (vlax-get-property ObjComNet 'About).

2. Лучше файл Class1.cs написать так:
Код:
[Выделить все]
using System;
using System.Windows.Forms;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;


namespace ComNet
{
    //Этот интерфейс нужен для взаимодействия с COM. 
    [InterfaceType(ComInterfaceType.InterfaceIsDual)]
    [Guid("254681E1-0824-4fd0-BD4A-05813A434DE1")]
    public interface ITestComponent
    {
        int Mul(int First, int Second);
        int Square { get; set; }
        String About(); // лучше сделать методом.
    }

    //Данный класс реализует .NET интерфейс ITestComponent, но в СОМ не экспонируется.
    [ClassInterface(ClassInterfaceType.None)]
    [ComDefaultInterface(typeof(ITestComponent))]
    [Guid("2B8F30EF-C587-418e-8768-F28E98FD80BB")]
    public class TestComponent : ITestComponent
    {
        // Закрытые данные экземпляра:
        private int m_iSquare;

        // Конструктор объекта класса:
        public TestComponent()
        {
            m_iSquare = 0;
        }
        
        // Свойства:
        public int Square
        {
            get
            {
                return m_iSquare;
            }
            set
            {
                m_iSquare = value * value;
            }
        }

        // Методы:
        public String About()
        {
            Form1 dlg = new Form1(); // класс Form1 должен быть internal, чтобы не экспонировать его в СОМ.
            dlg.ShowDialog();
            return "This component wrote on C#";
        }
        public int Mul(int First, int Second)
        {
            return First * Second;
        }
    }
}
Тогда в консоли lisp можно увидель следующее:
Цитата:
_$ (vl-load-com)

_$
_$ (setq srv (vlax-create-object "ComNet.TestComponent"))
#<VLA-OBJECT ITestComponent 0464fa70>
_$ (vlax-dump-object srv t)
; ITestComponent: nil
; Property values:
; Square = 0
; Methods supported:
; About ()
; Mul (2)
T
_$ (vlax-invoke-method srv 'mul 4 5)
20
_$ (vlax-invoke-method srv 'about)
"This component wrote on C#"
_$
3. Чтобы получить указанный результат мне потребовалось прочитать
Троелсен Эндрю. Язык программирования С# 2008 и платформа .NET 3.5, стр 1313 - 1319.

4. Существует ещё целая гора нюансов, связанная с атрибутами, описывающими классы, интерфейсы, методы, параметры методов и т.д., о которых нужно читать в справке MSDN. Я специалистом в этом вопросе не являюсь. Offtop: Я вообще теперь слесарь-сборщик. Дожил, мля...
__________________
...в шее моей жилы железные, и лоб мой - медный...

Последний раз редактировалось Pastor, 30.03.2011 в 16:50.
Pastor вне форума  
 
Непрочитано 30.03.2011, 17:12
#14
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Pastor
Отличная работа!
Александр Ривилис вне форума  
 
Непрочитано 30.03.2011, 19:00
#15
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от nikе Посмотреть сообщение
Я пришел домой и выполнил тест еще раз
Результаты в Bricscad 10:

: (setq ObjComNet (vlax-create-object "ComNet.TestComponent"))
#<VLA-OBJECT _TestComponent 0315002c>
: (vlax-invoke-method ObjComNet 'About)
"This component wrote on C#"
: (vlax-dump-object ObjComNet T)

; _TestComponent 0315002c : (null)
;
; Property values :
;
;
; Methods supported :
;
T

результаты в AutoCAD 2011:
Команда: (setq ObjComNet (vlax-create-object "ComNet.TestComponent"))
#<VLA-OBJECT _TestComponent 0b2df3ec>

Команда: (vlax-invoke-method ObjComNet 'About)
; ошибка: элемент не найден: ABOUT

Команда: (vlax-dump-object ObjComNet T)
; _TestComponent: nil
; Нет свойств
; Нет методов
T
Остается только догадываться почему брикскад не выдал ошибку и что он вообще выдал в командную строку... известно, что лисповый движок брикскада более поблажлив к ошибкам, но не до такой же степени
gomer вне форума  
 
Автор темы   Непрочитано 30.03.2011, 22:43
#16
nikе

конструктор Лего
 
Регистрация: 21.10.2005
Краснодар
Сообщений: 205


->Pastor
Спасибо, какой вы пытливый слесарь-сборщик!
Благодаря Вам появилось хорошее пособие по автоматизации кадов через C#.....
nikе вне форума  
 
Непрочитано 31.03.2011, 00:05
#17
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от nikе Посмотреть сообщение
Благодаря Вам появилось хорошее пособие по автоматизации кадов через C#.....
Может я ошибаюсь, но на C# лучше писать нет сборки подгружаемые прямо в автокад, а не сомнительные COM-серверы...
gomer вне форума  
 
Автор темы   Непрочитано 31.03.2011, 01:04
#18
nikе

конструктор Лего
 
Регистрация: 21.10.2005
Краснодар
Сообщений: 205


В AutoCAD мож и лучше, только у нас Bricscad, и в нем нет еще поддержки NET, а COM интерфейс уже довольно обкатанная технология, и универсальная... так что если хочется кроссплатформенности тогда - COM, и к версиям не привязан... Шаггидок не зря его нахваливает, ведь он - очень убедительный товарищ.
nikе вне форума  
 
Непрочитано 31.03.2011, 15:50
#19
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от nikе Посмотреть сообщение
В AutoCAD мож и лучше, только у нас Bricscad, и в нем нет еще поддержки NET, а COM интерфейс уже довольно обкатанная технология, и универсальная... так что если хочется кроссплатформенности тогда - COM, и к версиям не привязан... Шаггидок не зря его нахваливает, ведь он - очень убедительный товарищ.
COM лучше всего использовать для задач не свойственных bricscad или автокад (не важно) только не говорите что у вас классик версия... но и в этом случае drx лучше чем COM, по крайней мере быстрее... И еще я сильно сомневаюсь, что вы будете скакать с платформы на платформу....
gomer вне форума  
 
Автор темы   Непрочитано 31.03.2011, 20:04
#20
nikе

конструктор Лего
 
Регистрация: 21.10.2005
Краснодар
Сообщений: 205


->gomer
У нас восновном Bricscad Classic.
95% задач не требуют скорости, ну если понадобится что-то типа SCADFace или Overkill, можно на brx зафигачить. Но хочется все же иметь кроссплатформенный и кроссверсионный софт, нафига делать лишние препятствия народу, типа необходимости платить за переход на новую версию када?
nikе вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Почему AutoCAD не видит методы и свойства COM сервера?

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Документация Проектировщику на Torrents DEM Разное 263 03.09.2024 12:25
Юмор 2007 Огурец Разное 1172 29.12.2007 11:16
Поменялась последовательность действий в AutoCad 2006. Почему? и как вернуть? shpyliova AutoCAD 4 19.11.2007 15:42
AutoCAD 2005 - Русский - почему я его не люблю mAd!Duke AutoCAD 16 06.06.2005 08:03
почему Акад не видит тиф LZV Галина AutoCAD 3 23.08.2004 18:57