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

ADN Club => AutoCAD .NET API => Тема начата: Максим Маркевич от 08-09-2016, 09:00:39

Название: Почему AutoCAD не видит командный метод в режиме отладки?
Отправлено: Максим Маркевич от 08-09-2016, 09:00:39
Всем привет. Суть проблемы:
На конкретной машине (Windows7x64) конкретный AutoCAD(2017x64) не видит командный метод из сборки .dll в режиме отладки.
Код - C# [Выбрать]
  1. [CommandMethod("InsertBlock")]
Не видит - значит команда InsertBlock в AutoCAD "неизвестная команда".
Если просто открыть AutoCAD и подгрузить туда сборку (то есть не в режиме отладки), то все окей. Если запустить в режиме отладки AutoCAD2016x64 (то есть другой акад на той же машине), то все работает.
Я так понимаю, что это что-то очевидное, но ничего на ум не приходит. Буду признателен за помощь. Заранее, спасибо.
Название: Re: Почему AutoCAD не видит командный метод в режиме отладки?
Отправлено: Александр Ривилис от 08-09-2016, 09:04:15
Я так понимаю, что это что-то очевидное, но ничего на ум не приходит.
Например, для сборок AutoCAD в режиме отладки указано Copy Local = True вместо False
Кстати, а сборка в режиме отладки там вообще загружается?
Название: Re: Почему AutoCAD не видит командный метод в режиме отладки?
Отправлено: Максим Маркевич от 08-09-2016, 09:14:10
Например, для сборок AutoCAD в режиме отладки указано Copy Local = True вместо False
Нет. Проверял.
(https://s10.postimg.org/4tlwpoj11/screen_001.jpg) (https://postimg.org/image/4tlwpoj11/)
Кстати, а сборка в режиме отладки там вообще загружается?
Да, загружается (если критерием загрузки считать отсутствие ошибок после Netload).
Название: Re: Почему AutoCAD не видит командный метод в режиме отладки?
Отправлено: Александр Ривилис от 08-09-2016, 09:16:21
Нет. Проверял.
Проверь, что в каталоге Debug нет сборок AutoCAD.
Да, загружается (если критерием загрузки считать отсутствие ошибок после Netload).
Критерий неправильный. Вставь в метод Initialize отладочную печать или точку остановки и проверь.
Название: Re: Почему AutoCAD не видит командный метод в режиме отладки?
Отправлено: Владимир Шу от 08-09-2016, 09:34:19
Да, загружается (если критерием загрузки считать отсутствие ошибок после Netload).
Смотри версии .net framework. какая на удаленной машине и под которую собран проект.
Я как то собрал под 2014 акад с .net 4.5 ... и на 2х машинах не запустилось и ошибок не было, потому что там .net 4.0 было...
Название: Re: Почему AutoCAD не видит командный метод в режиме отладки?
Отправлено: Максим Маркевич от 08-09-2016, 09:34:57
Проверь, что в каталоге Debug нет сборок AutoCAD.
(https://s16.postimg.org/ag8h7f74h/screen_002.jpg) (https://postimg.org/image/ag8h7f74h/)
Критерий неправильный. Вставь в метод Initialize отладочную печать или точку остановки и проверь.
Делаю.
(https://s12.postimg.org/vt37zcpvd/screen_003.jpg) (https://postimg.org/image/vt37zcpvd/)
Сделано:
(https://s9.postimg.org/4fvornz2z/screen_004.jpg) (https://postimg.org/image/4fvornz2z/)
Вот это поворот!
Ведь реально не загружается. А я думал, что "доверительное окошко" и отсутствие ошибок - это критерий корректной загрузки сборки.

Update:
Извиняюсь! Я некорректно выполнил метод Initialize.
В итоге, сборка загружается:
(https://s17.postimg.org/qhr0z2ibf/screen_003.jpg) (https://postimg.org/image/qhr0z2ibf/)
Но в ней не работает командный метод. Как такое может быть?
Название: Re: Почему AutoCAD не видит командный метод в режиме отладки?
Отправлено: Максим Маркевич от 08-09-2016, 09:53:56
Смотри версии .net framework. какая на удаленной машине и под которую собран проект.
Я как то собрал под 2014 акад с .net 4.5 ... и на 2х машинах не запустилось и ошибок не было, потому что там .net 4.0 было...
Это не удаленная машина. Поехал в Москву на неделю, пришлось с собой ноут взять, чтобы была возможность поработать. Версия .Net framework, которая у меня установлена - это 4.6:
(https://s17.postimg.org/yofzrbqh7/screen_001.jpg) (https://postimg.org/image/yofzrbqh7/)
А сборку собираю при помощи 4.5. Я так понимаю, что проблем не должно быть.
Название: Re: Почему AutoCAD не видит командный метод в режиме отладки?
Отправлено: Александр Ривилис от 08-09-2016, 10:50:29
В итоге, сборка загружается:

Но в ней не работает командный метод. Как такое может быть?
Убедись, что в методе Initilize не возникает исключение. Лучше всего оберни весь код в:
Код - C# [Выбрать]
  1. try {
  2. // тут твой код
  3. } catch {};
Если исключение возникает, то ни один командный метод работать не будет.
Название: Re: Почему AutoCAD не видит командный метод в режиме отладки?
Отправлено: Максим Маркевич от 08-09-2016, 12:01:14
Убедись, что в методе Initilize не возникает исключение. Лучше всего оберни весь код в:
Так ведь я Initilize вызываю из другого класса.
Код - C# [Выбрать]
  1.     public class CommandClassTest
  2.     {
  3.         // Смешно и непонятно, но это не работает в стадии отладки в AutoCAD 2017x64
  4.         // на конкретном компе
  5.         [CommandMethod("InsertBlock")]
  6.         public void InsertBlock()
  7.         {
  8.             Editor ed =
  9.                Application.DocumentManager.MdiActiveDocument.Editor;
  10.             ed.WriteMessage("ВОТ ЭТОТ МЕТОД НЕ РАБОТАЕТ В СТАДИИ ОТЛАДКИ!!!");
  11.         }
  12.     }
  13.     // Все методы класса ниже полноценно работают
  14.     public class InitializationTest : IExtensionApplication
  15.     {
  16.         public void Initialize()
  17.         {
  18.             Editor ed =
  19.               Application.DocumentManager.MdiActiveDocument.Editor;
  20.             ed.WriteMessage("СБОРКА ЗАГРУЖАЕТСЯ!!!");
  21.         }
  22.         public void Terminate()
  23.         {
  24.             Console.WriteLine("Это от балды");
  25.         }
  26.         [CommandMethod("TST")]
  27.         public void Test()
  28.         {
  29.             Editor ed =
  30.               Application.DocumentManager.MdiActiveDocument.Editor;
  31.             ed.WriteMessage("Тестовый командный метод.");
  32.         }
  33.     }
  34.  
Я уже и не знаю, что думать.:( Вроде как, сборка загружается. Командный метод простейший, но не работает в стадии отладки, а работает, если загружать его просто в автокад.
Название: Re: Почему AutoCAD не видит командный метод в режиме отладки?
Отправлено: Андрей Бушман от 08-09-2016, 13:11:10
Не видя полного исходного кода - это напоминает лечение по фотографии. Например, возможно у тебя сборке назначен атрибут CommandClass, указывающий на др. тип вместо CommandClassTest.
Название: Re: Почему AutoCAD не видит командный метод в режиме отладки?
Отправлено: Александр Ривилис от 08-09-2016, 13:16:55
[CommandMethod("TST")]
Эта команда в режиме отладки у тебя работает?
Название: Re: Почему AutoCAD не видит командный метод в режиме отладки?
Отправлено: Александр Ривилис от 08-09-2016, 13:28:18
На конкретной машине (Windows7x64) конкретный AutoCAD(2017x64) не видит командный метод из сборки .dll в режиме отладки.
Кстати, убедись, что установлен SP1 на AutoCAD 2017x64:
http://adn-cis.org/autocad-2017-sp1-i-otladka-.net-prilozhenij.html
http://adn-cis.org/autocad-2017-service-pack-1-mexanizm-avtozagruzki.html
Название: Re: Почему AutoCAD не видит командный метод в режиме отладки?
Отправлено: Максим Маркевич от 08-09-2016, 13:30:10
Не видя полного исходного кода - это напоминает лечение по фотографии. Например, возможно у тебя сборке назначен атрибут CommandClass, указывающий на др. тип вместо CommandClassTest.
Так ведь тогда бы не работало в AutoCAD2016 в режиме отладки. А у меня не работает отладка только в AutoCAD 2017.
Но намек понял - прикрепляю проект.
Эта команда в режиме отладки у тебя работает?
Нет, ни один командный метод у меня не работает в режиме отладки в AutoCAD2017x64. Да я бы забил на эту мелочь. Столько всего уже переделал, никогда не ожидал подвоха в таком месте. Уверен, это как-то связано с ноутом, на котором я впервые что-то пишу (или .Net framework, как говорил Boxa.Shu, или какие-то непонятные мне настройки). Но не могу дальше работать :) Не отпускает.
Название: Re: Почему AutoCAD не видит командный метод в режиме отладки?
Отправлено: Максим Маркевич от 08-09-2016, 14:21:51
Кстати, убедись, что установлен SP1 на AutoCAD 2017x64:
http://adn-cis.org/autocad-2017-sp1-i-otladka-.net-prilozhenij.html
http://adn-cis.org/autocad-2017-service-pack-1-mexanizm-avtozagruzki.html
Такого подвоха я никак не ожидал!!!  :(
Ноутом почти не пользуюсь, видимо ставил этот акад еще зимой, когда не было SP1. В противном случае, он бы загрузился.
Александр Ривилис, огромное спасибо. Очень признателен!!! :)
Пол дня убито. >:( Радует то, что параллельно захвачена такая тема как метод Initilize.
Название: Re: Почему AutoCAD не видит командный метод в режиме отладки?
Отправлено: Андрей Бушман от 08-09-2016, 14:25:06
Дабы не заморачиваться с ситуациями, подобными той, что обозначена на скрине ниже (т.е. возникающими при открытии твоих проектов на др. произвольных машинах), ты можешь пользоваться соответствующими NuGet-пакетами: http://bushman-andrey.blogspot.ru/2016/07/nuget-autocad-net-api.html

В этом случае скачав твой проект архив или с гитхаба или с битбукета достаточно будет лишь заменить имя удалённой машинки и нажать F5 для старта отладки.
Название: Re: Почему AutoCAD не видит командный метод в режиме отладки?
Отправлено: Максим Маркевич от 08-09-2016, 14:34:55
Дабы не заморачиваться с ситуациями, подобными той, что обозначена на скрине ниже (т.е. возникающими при открытии твоих проектов на др. произвольных машинах), ты можешь пользоваться соответствующими NuGet-пакетами: http://bushman-andrey.blogspot.ru/2016/07/nuget-autocad-net-api.html
Я только твоими пакетами и пользуюсь с тех пор, как про них узнал.
(https://s16.postimg.org/jurto7rtt/screen.jpg) (https://postimg.org/image/jurto7rtt/)
Есть только одно исключение, это проекты с WPF окошками, как-то там некорректно заменилась однажды ссылка на System.Windows.Interactivity  (я еще не разобрался, по вине нугета или я сам накосячил), но с тех пор (уже как 2 дня:) ) в проекты с WPF я ссылки добавляю вручную, потому что в тот раз знатно провозился.
Так вот этот проект для теста я вычленял из проекта с WPF, посему здесь ручная подгрузка из Object ARX.
 
Название: Re: Почему AutoCAD не видит командный метод в режиме отладки?
Отправлено: Александр Ривилис от 08-09-2016, 14:42:17
Такого подвоха я никак не ожидал!!!
Я правильно понял, что проблема была в отсутствии SP1 на AutoCAD 2017?
Название: Re: Почему AutoCAD не видит командный метод в режиме отладки?
Отправлено: Максим Маркевич от 08-09-2016, 14:43:24
Я правильно понял, что проблема была в отсутствии SP1 на AutoCAD 2017?
Ну так, а кнопка РЕШЕНИЕ ни о чем не говорит?  ;)
Именно в этом! Спасибо еще раз!!
Кстати, можно зацепить еще вопрос.. Мне кажется, здесь он будет в тему.
Если долго-долго что-то отлаживать (то есть много раз запускать код в режиме отладки), то в какой-то момент акад перестает запускаться  - то есть он висит в стадии запуска и все. В таком случае, необходимо перезагружать комп. Может, кто-то сможет пояснить, в чем дело?
Название: Re: Почему AutoCAD не видит командный метод в режиме отладки?
Отправлено: Александр Ривилис от 08-09-2016, 14:51:27
Ну так, а кнопка РЕШЕНИЕ ни о чем не говорит?  ;)
Это я на всякий случай уточняю, так как с таким не сталкивался и при отсутствии SP1 на AutoCAD 2017. Но у меня в Visual Studio 2013 и 2015 для отладчика стояли опции Options --> Debugging --> Use Managed Compability Mode с самого начала.
Название: Re: Почему AutoCAD не видит командный метод в режиме отладки?
Отправлено: Александр Ривилис от 08-09-2016, 14:56:19
Может, кто-то сможет пояснить, в чем дело?
Пояснить не могу, но лечится убиванием процесса acad.exe и еще парочки сопутствующих процессов (сейчас точно названия не вспомню), которые запускаются вместе с AutoCAD. Думаю что проблема в "межпроцессном" взаимодействии, когда эти  сопутствующие процессы теряют связь с acad.exe, а вновь запущенный процесс acad.exe тоже не в состоянии установить с ними связь. Один из этих процессов связан с системой лицензирования AutoCAD.
Название: Re: Почему AutoCAD не видит командный метод в режиме отладки?
Отправлено: Максим Маркевич от 08-09-2016, 15:07:38
Это я на всякий случай уточняю, так как с таким не сталкивался и при отсутствии SP1 на AutoCAD 2017. Но у меня в Visual Studio 2013 и 2015 для отладчика стояли опции Options --> Debugging --> Use Managed Compability Mode с самого начала.
Да, когда я начинал что-то пробовать, то везде натыкался на то, что нужно ставить голочку в Use Managed Compability Mode, а потом заметил, что работает все и без нее (на AutoCAD2017x64), а сегодня догнал, что это только в том случае, если установлен SP1. То есть, в принципе, моя проблема была бы и решена установкой галочки, но, учитывая тот факт, что я с непривычным для работы компом, я совсем об этом забыл.
Пояснить не могу, но лечится убиванием процесса acad.exe и еще парочки сопутствующих процессов (сейчас точно названия не вспомню), которые запускаются вместе с AutoCAD. Думаю что проблема в "межпроцессном" взаимодействии, когда эти  сопутствующие процессы теряют связь с acad.exe, а вновь запущенный процесс acad.exe тоже не в состоянии установить с ними связь. Один из этих процессов связан с системой лицензирования AutoCAD.
Да, я пытался "убивать" acad.exe, но это не помогало, поэтому перезагружался. Теперь ясно, что процессов несколько. Спасибо! :)
Название: Re: Почему AutoCAD не видит командный метод в режиме отладки?
Отправлено: Александр Ривилис от 09-09-2016, 19:45:07
Да, я пытался "убивать" acad.exe, но это не помогало, поэтому перезагружался. Теперь ясно, что процессов несколько. Спасибо! :)
Мне кажется, что обычно достаточно убить эти процессы:

(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fimg-fotki.yandex.ru%2Fget%2F45704%2F7842324.7%2F0_1368d8_bfa2b393_orig.png&hash=1f1c2592cb128caf1ec563ea4c81fd12)
Последний из них в первую очередь.


Название: Re: Почему AutoCAD не видит командный метод в режиме отладки?
Отправлено: Максим Маркевич от 09-09-2016, 21:48:36
Мне кажется, что обычно достаточно убить эти процессы:
В ближайший же незапуск протестирую.  ;)
Название: Re: Почему AutoCAD не видит командный метод в режиме отладки?
Отправлено: Максим Маркевич от 17-09-2016, 23:33:51
Мне кажется, что обычно достаточно убить эти процессы:
У меня оказалось достаточным убить: acad.exe(разумеется) и WSCommCntr4.exe.
Процессы типа AcWebBrowser.exe*32, вообще, убить не выходит, они сразу воссоздаются.
Пользуюсь Windows10x64, AutoCAD2017x64.