Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: Борис_С от 22-08-2021, 20:50:41

Название: Не могу создать com-объект AutoCAD
Отправлено: Борис_С от 22-08-2021, 20:50:41
Всем доброго времени суток.
У меня такая проблемка. Не создается com-объект AutoCAD.
Для подключения к AutoCAD использую следующий код:
Код - C# [Выбрать]
  1. dynamic acApp = null;   // ссылка на экземпляр Application приложения AutoCAD
  2. public void GetComApp()
  3. {
  4.          try
  5.         {            {
  6.                 // Получение ссылки на экземпляр Application уже запущенного приложения AutoCAD
  7.                 acApp = CallFunc(() => Marshal.GetActiveObject("AutoCAD.Application"));
  8.             }
  9.             catch
  10.             {
  11.                 try
  12.                 {
  13.                     // Создание нового экземпляра Application приложения AutoCAD
  14.                     Type comAppType = Type.GetTypeFromProgID("AutoCAD.Application");
  15.                     acApp = GetApp(() => Activator.CreateInstance(comAppType));                    
  16.                 }
  17.                 catch(System.Exception e)
  18.                 {
  19.                     MessageBox.Show("Cannot create Com object AutoCAD");
  20.                 }
  21.             }
  22.       }
  23. }
  24.  

Метод CallFunc описан в сообщении https://adn-cis.org/forum/index.php?topic=7364.0
Все это прекрасно работало. Пару дней назад обнаружил, что код перестал работать.
Подключение к запущенному автокаду не происходит.
Значение переменной comAppType в операторе Type comAppType = Type.GetTypeFromProgID("AutoCAD.Application"); равно null
На компе стоит AutoCAD 2020.1
Спасибо.
Название: Re: Не могу создать com-объект AutoCAD
Отправлено: Александр Ривилис от 22-08-2021, 22:55:42
Борис_С,
Могу лишь посочувствовать. В первую очередь смотрите какие обновления Windows/AutoCAD были установлены с момента, когда это работало.
Возможно придётся переустанавливать AutoCAD. Это если не меняли разрядность вашего приложения. Разрядность приложения должна совпадать с разрядностью AutoCAD. В противном случае точно будут проблемы. Заодно проверьте в реестре наличие HKEY_CLASSES_ROOT\AutoCAD.Application и на что он ссылается.
Название: Re: Не могу создать com-объект AutoCAD
Отправлено: Борис_С от 23-08-2021, 16:01:29
AutoCAD.Application имеет 2 подпапки:
CLSID - значение - {4AC6DFE1-607B-45B2-B289-D7FBCD44169C}
CurVer - значение - AutoCAD.Application.23
Название: Re: Не могу создать com-объект AutoCAD
Отправлено: Александр Ривилис от 23-08-2021, 18:02:22
AutoCAD.Application имеет 2 подпапки:
CLSID - значение - {4AC6DFE1-607B-45B2-B289-D7FBCD44169C}
CurVer - значение - AutoCAD.Application.23
Этого недостаточно. Нужно проверять всю цепочку.

(https://live.staticflickr.com/65535/51396611452_69d7c73e34_o.png)

И установи своему приложению Platform Target: x64

(https://live.staticflickr.com/65535/51396625272_3c7e13a397_o.png)

Название: Re: Не могу создать com-объект AutoCAD
Отправлено: Борис_С от 25-08-2021, 10:48:31
А зачем менять Any CPU на x64. У меня стоит 64 битный Windows. Any CPU и означает, что программа подхватит текущую версию системы и будет работать с 64 битной версией.
Название: Re: Не могу создать com-объект AutoCAD
Отправлено: Александр Ривилис от 25-08-2021, 10:54:27
А зачем менять Any CPU на x64. У меня стоит 64 битный Windows. Any CPU и означает, что программа подхватит текущую версию системы и будет работать с 64 битной версией.
Нет. Совершенно необязательно.
Название: Re: Не могу создать com-объект AutoCAD
Отправлено: Борис_С от 25-08-2021, 11:00:38
Немного подправил реестр.
Программа стала создавать com-объект, но по-прежнему не видит уже запущенную программу и не подключается к ней.
Название: Re: Не могу создать com-объект AutoCAD
Отправлено: Александр Ривилис от 25-08-2021, 12:54:04
Немного подправил реестр.
В чем заключались правки?
Название: Re: Не могу создать com-объект AutoCAD
Отправлено: Борис_С от 25-08-2021, 13:31:12
не было HKEY_CLASSES_ROOT\AutoCAD.Application
было только HKEY_CLASSES_ROOT\AutoCAD.Application.23

Мой коллега создал HKEY_CLASSES_ROOT\AutoCAD.Application, настроив его на HKEY_CLASSES_ROOT\AutoCAD.Application.23
Название: Re: Не могу создать com-объект AutoCAD
Отправлено: Александр Ривилис от 25-08-2021, 13:36:48
не было HKEY_CLASSES_ROOT\AutoCAD.Application
Ну тогда наверняка нет еще кучи веток в реестре. Нужно или откатывать систему на дату, когда всё работало или переустанавливать AutoCAD. Другого способа нет. Найти все необходимые ветки реестра и создать их вручную нереально.
Подозреваю, что установлен какой-нибудь чистильщих типа reg organizer или ccleaner, которые чистят реестр от того, что ини считают неиспользуемым и ненужным. Результат обычно именно такой...
Название: Re: Не могу создать com-объект AutoCAD
Отправлено: Борис_С от 25-08-2021, 15:24:45
Спасибо, Саша. Будет окно, переставлю.
Название: Re: Не могу создать com-объект AutoCAD
Отправлено: Борис_С от 27-08-2021, 10:43:00
Я не прав. Все работает. Подключаюсь и к работающему приложению. Здесь оказалась одна тонкость. Действительно нельзя подключиться к приложению сразу после старта, но, если загрузить в AutoCAD хотя бы один файл, подключаюсь на ура.
Название: Re: Не могу создать com-объект AutoCAD
Отправлено: marsh_one от 23-09-2021, 14:28:28
Александр Ривилис,  Добрый день. Александр, подскажите каким образом можно установить Platform Target: x64?
У меня похожая проблема, выскакивала ошибка, я добавил в код
Код - C# [Выбрать]
  1.         const uint RPC_E_SERVERFAULT = 0x80010105;
  2.         const uint HRESULT = 0x800706BA;

Теперь при запуске просто висит и нчиего не происходит, типа бесконечного цикла.
Название: Re: Не могу создать com-объект AutoCAD
Отправлено: Александр Ривилис от 23-09-2021, 14:35:52
Добрый день. Александр, подскажите каким образом можно установить Platform Target: x64?

(https://live.staticflickr.com/65535/51396625272_3c7e13a397_o.png)


я добавил в код
Код - C# [Выбрать]

            const uint RPC_E_SERVERFAULT = 0x80010105;
            const uint HRESULT = 0x800706BA;


Теперь при запуске просто висит и нчиего не происходит, типа бесконечного цикла.
Не понял взаимосвязь.
Название: Re: Не могу создать com-объект AutoCAD
Отправлено: marsh_one от 23-09-2021, 15:08:25
Вот в этой теме.
https://adn-cis.org/forum/index.php?topic=7364.0

Код - C# [Выбрать]
  1.     public partial class Form1 : Form
  2.     {
  3.         const int sleep = 500;
  4.         const uint RPC_E_CALL_REJECTED = 0x80010001;
  5.         const uint RPC_E_RETRY = 0x80010109;
  6.         const uint RPC_E_SERVERCALL_RETRYLATER = 0x8001010A;
  7.         const uint RPC_S_SERVER_TOO_BUSY = 1723;
  8.         const uint RPC_E_SERVERFAULT = 0x80010105;
  9.         const uint HRESULT = 0x800706BA;
  10.        
  11.  
  12.         public Form1()
  13.         {
  14.             InitializeComponent();
  15.         }
  16.  
  17.         private static string FormatNumber(string text)
  18.         {
  19.             if (double.TryParse(text, out double number))
  20.             {
  21.                 return number.ToString("N", CultureInfo.CreateSpecificCulture("en-US"));
  22.                 // Console.WriteLine(number);
  23.             }
  24.             return text;
  25.         }
  26.  
  27.         static void WriteErrorMsg(Exception ex, ConsoleColor c)
  28.         {
  29.             ConsoleColor prew = ForegroundColor;
  30.             ForegroundColor = c;
  31.  
  32.             Error.WriteLine("\nException (HResult = {0}):\n{1}",ex.HResult, ex.Message);
  33.             ForegroundColor = prew;
  34.         }
  35.  
  36.         /// <summary>
  37.         /// Проверка доступности COM объекта Application,
  38.         /// представляющего экземпляр AutoCAD.
  39.         /// </summary>
  40.         /// <param name="app">COM объект Application.</param>
  41.         /// <returns>Возвращается true в случае готовности
  42.         /// объекта Application к работе. В противном случае
  43.         /// возвращается false.</returns>
  44.         ///
  45.         static bool CheckReady(object app)
  46.         {
  47.  
  48.             if (app == null)
  49.                 return false;
  50.  
  51.             dynamic acad = app;
  52.             bool isQuiescent = false;
  53.  
  54.             while (true)
  55.             {
  56.                 try
  57.                 {
  58.                     dynamic state = acad.GetAcadState();
  59.                     isQuiescent = state.IsQuiescent;
  60.                     break;
  61.                 }
  62.                 catch (COMException ex)
  63.                 {
  64.                     uint err = (uint)ex.ErrorCode;
  65.                     switch (err)
  66.                     {
  67.                         case RPC_E_CALL_REJECTED:
  68.                         case RPC_E_RETRY:
  69.                         case RPC_E_SERVERCALL_RETRYLATER:
  70.                         case RPC_S_SERVER_TOO_BUSY:
  71.                         case RPC_E_SERVERFAULT:
  72.                         case HRESULT:
  73.  
  74.                         {
  75.                                 WriteErrorMsg(ex, ConsoleColor.Yellow);
  76.                                 Thread.Sleep(sleep);
  77.                                 break;
  78.                             }
  79.                         default:
  80.                             {
  81.                                 WriteErrorMsg(ex, ConsoleColor.Red);
  82.                                 throw;
  83.                             }
  84.                     }
  85.                 }
  86.                 catch (Exception ex)
  87.                 {
  88.                     WriteErrorMsg(ex, ConsoleColor.Red);
  89.                     throw;
  90.                 }
  91.             }
  92.             return isQuiescent;
  93.         }
  94.  
  95.         /// <summary>
  96.         /// Получить COM объект Application.
  97.         /// </summary>
  98.         /// <param name="func">Лямбда-выражение, возвращающее
  99.         /// искомый COM объект Application.</param>
  100.         /// <returns>Возвращается COM объект Application.
  101.         /// </returns>
  102.         static object GetApp(Func<object> func)
  103.         {
  104.  
  105.             if (func == null)
  106.             {
  107.                 throw new ArgumentNullException(nameof(func));
  108.             }
  109.  
  110.             while (true)
  111.             {
  112.                 try
  113.                 {
  114.                     object obj = func();
  115.                     return obj;
  116.                 }
  117.                 catch (COMException ex)
  118.                 {
  119.                     uint err = (uint)ex.ErrorCode;
  120.                     switch (err)
  121.                     {
  122.                         case RPC_E_CALL_REJECTED:
  123.                         case RPC_E_RETRY:
  124.                         case RPC_E_SERVERCALL_RETRYLATER:
  125.                         case RPC_S_SERVER_TOO_BUSY:
  126.                         case RPC_E_SERVERFAULT:
  127.                         case HRESULT:
  128.                             {
  129.                                 WriteErrorMsg(ex, ConsoleColor.Yellow);
  130.                                 Thread.Sleep(sleep);
  131.                                 break;
  132.                             }
  133.                         default:
  134.                             {
  135.                                 WriteErrorMsg(ex, ConsoleColor.Red);
  136.                                 throw;
  137.                             }
  138.                     }
  139.                 }
  140.                 catch (Exception ex)
  141.                 {
  142.                     WriteErrorMsg(ex, ConsoleColor.Red);
  143.                     throw;
  144.                 }
  145.             }
  146.         }
  147.  
  148.  
  149.         //
  150.         /// <summary>
  151.         /// Метод предназначен для получения COM-объекта или
  152.         /// значения его свойств. Или же для вызова метода COM-
  153.         /// объекта, возвращающего некоторое значение.
  154.         /// </summary>
  155.         /// <param name="app">COM объект Application.</param>
  156.         /// <param name="func">Лямбда-выражение, подлежащее
  157.         /// выполнению.</param>
  158.         /// <returns>Возвращаемый тип Object вызывающая сторона
  159.         /// должна присваивать dynamic-переменной, дабы можно
  160.         /// было полноценно использовать свойства, методы и
  161.         /// события полученного объекта (без рефлексии).
  162.         /// </returns>
  163.         static object CallFunc(object app, Func<object> func)
  164.         {
  165.                 if (app == null)
  166.                 throw new ArgumentNullException(nameof(app));
  167.  
  168.             if (func == null)
  169.                 throw new ArgumentNullException(nameof(func));
  170.  
  171.             while (!CheckReady(app))
  172.             {
  173.                 // ждём, когда приложение будет готово...
  174.             }
  175.  
  176.             object obj = func();
  177.             return obj;
  178.         }
  179.  
  180.         /// <summary>
  181.         /// Метод предназначен для изменения свойств COM-объекта
  182.         /// , или же для вызова метода COM-объекта, ничего не
  183.         /// возвращающего в качестве результата.
  184.         /// </summary>
  185.         /// <param name="app">COM объект Application.</param>
  186.         /// <param name="func">Лямбда-выражение, подлежащее
  187.         /// выполнению.</param>
  188.         static void DoAction(object app, Action func)
  189.         {
  190.  
  191.             if (app == null)
  192.                 throw new ArgumentNullException(nameof(app));
  193.  
  194.             if (func == null)
  195.                 throw new ArgumentNullException(nameof(func));
  196.  
  197.             while (!CheckReady(app))
  198.             {
  199.                 // ждём, когда приложение будет готово...
  200.             }
  201.  
  202.             func();
  203.         }

Я по сути делаю, тоже , что и у автора этой темы. Но выскакивают ошибки.
Я их добавлял в исключения.

Код - C# [Выбрать]
  1.         const uint RPC_E_SERVERFAULT = 0x80010105;
  2.         const uint HRESULT = 0x800706BA;

Сейчас когда заупскаю приложение, просто висит и нчиего не происходит.

Как вызвать окно показанное Вами на скрине?


Название: Re: Не могу создать com-объект AutoCAD
Отправлено: Александр Ривилис от 23-09-2021, 15:14:52
RPC_E_SERVERFAULT
Это ошибка сервера. С ней ничего сделать нельзя.
Название: Re: Не могу создать com-объект AutoCAD
Отправлено: Александр Ривилис от 23-09-2021, 15:15:32
Как вызвать окно показанное Вами на скрине?
Свойства проекта в Visual Studio:
(https://live.staticflickr.com/65535/51507453739_0ee2cf8ce4_o.png)


Название: Re: Не могу создать com-объект AutoCAD
Отправлено: marsh_one от 23-09-2021, 15:39:30
RPC_E_SERVERFAULT
Это ошибка сервера. С ней ничего сделать нельзя.

Т.е. а такой подход что использован в коде никак не решит эту проблему?
Название: Re: Не могу создать com-объект AutoCAD
Отправлено: Александр Ривилис от 23-09-2021, 15:44:19
Т.е. а такой подход что использован в коде никак не решит эту проблему?
Проблему с RPC_E_SERVERFAULT кодом решить нельзя. Нужно понять почему эта ошибка возникает. В отличие от остальных ошибок, когда сервер занят, и повторное обращение через какое-то время может исправить ошибку, эта ошибка постоянная. AutoCAD при этом запускается?
Название: Re: Не могу создать com-объект AutoCAD
Отправлено: marsh_one от 23-09-2021, 15:47:03
Нет. Атокад не запускается.
Автокад пытаюсь вызвать так:
Код - C# [Выбрать]
  1.                 Type comAppType = Type.GetTypeFromProgID("AutoCAD.Application");
  2.  
  3.                 dynamic app = GetApp(() => Activator.CreateInstance(comAppType));
  4.  
  5.  
  6.  
  7.                 if (app == null)
  8.                 {
  9.                     WriteLine("Не удалось получить объект Application Press any key for exit...");
  10.                     ReadKey();
  11.                     return;
  12.                 }
  13.  
  14.                 dynamic docs = CallFunc((object)app,() => app.Documents);
  15.                 Открываем существующий документ
  16.                 dynamic doc1 = CallFunc((object)app,() => docs.Open(@"fileName"));
  17.  
  18.                 // по умолчанию Visible установлен в false
  19.                 DoAction((object)app, () => app.Visible = true);
  20.  
  21.                 WriteLine("\nPress any key for dociments close...");
  22.                 ReadKey();

fileName - путь.
Просто форма висит и всё..
Название: Re: Не могу создать com-объект AutoCAD
Отправлено: Александр Ривилис от 23-09-2021, 15:50:43
marsh_one,
Пройдись под отладчиком. RPC_E_SERVERFAULT убери. Разберись создаётся ли app.
Название: Re: Не могу создать com-объект AutoCAD
Отправлено: marsh_one от 23-09-2021, 16:43:19
Удалил.
Код - C# [Выбрать]
  1. const uint RPC_E_SERVERFAULT = 0x80010105;
Форма также висит.
Ничего не изменилось.
Как проверить, что арр содается?
Название: Re: Не могу создать com-объект AutoCAD
Отправлено: Александр Ривилис от 23-09-2021, 16:54:42
Как проверить, что арр содается?
Под отладчиком пошаговое выполнение.
Название: Re: Не могу создать com-объект AutoCAD
Отправлено: Александр Ривилис от 23-09-2021, 16:57:00
P.S.: Это тоже убери:
Код - C# [Выбрать]
  1. case HRESULT:
Название: Re: Не могу создать com-объект AutoCAD
Отправлено: Александр Ривилис от 23-09-2021, 17:04:33
const uint HRESULT = 0x800706BA;
Этот код означает, что RPC-сервер недоступен: http://windowsbulletin.com/ru/rpc-server-is-unavailable-error-code-0x800706ba-fix/
Не очень понятно как это связано с данным случаем. Возможно отключена служба RPC в системе:

(https://live.staticflickr.com/65535/51507980005_6b08be6db6_o.png)

Название: Re: Не могу создать com-объект AutoCAD
Отправлено: marsh_one от 23-09-2021, 17:28:01

(https://i.postimg.cc/18WC12n5/image.png) (https://postimg.cc/18WC12n5)
Убрал   
Код - C# [Выбрать]
  1.     case HRESULT:
Форма висит.
ЕСли убрать строку
Код - C# [Выбрать]
  1.                 dynamic doc1 = CallFunc((object)app,() => docs.Open(@"fileName"));
.
ТО могу форму, зажав ЛКМ можно двигать.
Александр, а в отладчике пошагово как реализовать? Шаг с заходом?


Название: Re: Не могу создать com-объект AutoCAD
Отправлено: Александр Ривилис от 23-09-2021, 17:31:06
Александр, а в отладчике пошагово как реализовать? Шаг с заходом?
Конечно. Нужно же понять создался ли AutoCAD как COM-сервер.
Название: Re: Не могу создать com-объект AutoCAD
Отправлено: marsh_one от 23-09-2021, 17:40:55
Запустив "шаг с обходом" где можно посмотреть пошагово?
Название: Re: Не могу создать com-объект AutoCAD
Отправлено: marsh_one от 23-09-2021, 17:43:20

(https://i.postimg.cc/jDMLtQ4h/image.png) (https://postimg.cc/jDMLtQ4h)
Название: Re: Не могу создать com-объект AutoCAD
Отправлено: Александр Ривилис от 23-09-2021, 18:03:33
Поставь точку останова здесь:
Код - C# [Выбрать]
  1. Type comAppType = Type.GetTypeFromProgID("AutoCAD.Application");
После этого выполни пошаговую отладку.
P.S.: Я так понимаю, что тебе нужно заняться изученим возможностей MS Visual Studio.
Название: Re: Не могу создать com-объект AutoCAD
Отправлено: marsh_one от 27-09-2021, 10:04:22
P.S.: Я так понимаю, что тебе нужно заняться изученим возможностей MS Visual Studio.
И не говорите)
Название: Re: Не могу создать com-объект AutoCAD
Отправлено: marsh_one от 27-09-2021, 10:31:55
Александр Ривилис, доброе утро.
Вроде с пошаговой разобрался.

(https://i.ibb.co/fSz4phL/image.png) (https://ibb.co/9vksTFS)
Название: Re: Не могу создать com-объект AutoCAD
Отправлено: marsh_one от 27-09-2021, 12:29:01
const uint HRESULT = 0x800706BA;
Этот код означает, что RPC-сервер недоступен: http://windowsbulletin.com/ru/rpc-server-is-unavailable-error-code-0x800706ba-fix/
Не очень понятно как это связано с данным случаем. Возможно отключена служба RPC в системе:

(https://live.staticflickr.com/65535/51507980005_6b08be6db6_o.png)
Проверил указанные службы. Всё работает.
Название: Re: Не могу создать com-объект AutoCAD
Отправлено: Александр Ривилис от 27-09-2021, 14:31:46
marsh_one,
Ну значит у тебя совсем не запускается AutoCAD через COM/ActiveX. Вполне возможно что у тебя плохо установлен AutoCAD или проблемы с Windows.
Название: Re: Не могу создать com-объект AutoCAD
Отправлено: marsh_one от 27-09-2021, 15:45:20
Корпоративная машина. Антивирь и прочее отключил...Странно.
Попробую попросить установить 2014. Вроде как самый наименее глючный.
Спасибо. Завтра отпишусь.
Название: Re: Не могу создать com-объект AutoCAD
Отправлено: Александр Ривилис от 27-09-2021, 15:48:22
Корпоративная машина.
Причина может именно в этом, если есть ограничение прав.
Попробую попросить установить 2014. Вроде как самый наименее глючный.
Если это Windows 10, то AutoCAD 2014 на ней не поддерживается.
Название: Re: Не могу создать com-объект AutoCAD
Отправлено: marsh_one от 29-09-2021, 11:37:03
Александр Ривилис, Добрый день.
Александр, установил 2014. Всё заработало )
Спасибо.
Но я далее стал по вашему форуму копаться, т.к. задача стоит по нахождению и изменению объектов в документе.
Нашёл следующую тему.
https://adn-cis.org/forum/index.php?topic=10341.0
Вроде в целом всё ясно. Попробовал применить к своей задаче, исключив список.
Ругается на вот этот фрагмент. (см. скрин).


(https://i.postimg.cc/YL3t6ZgS/image.png) (https://postimg.cc/YL3t6ZgS)

Подскажите с чем может быть связано?
Название: Re: Не могу создать com-объект AutoCAD
Отправлено: Александр Ривилис от 29-09-2021, 12:01:28
Подскажите с чем может быть связано?
Один вопрос - одна тема! Создай новую тему, приведи нормальный кусок кода и тебе попробуют помочь.
Название: Re: Не могу создать com-объект AutoCAD
Отправлено: marsh_one от 29-09-2021, 12:28:47
ок. Понял. Сейчас пока сам покопаю.
Спасибо за помощь.