Вылетает AutoCAD из-за WPF Hyperlink

Автор Тема: Вылетает AutoCAD из-за WPF Hyperlink  (Прочитано 22518 раз)

0 Пользователей и 3 Гостей просматривают эту тему.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Вылетает AutoCAD из-за WPF Hyperlink
« Ответ #30 : 17-11-2015, 21:16:05 »
Во-вторых - тормозит, когда Exception ловит,заметно причем
В этом месте никаких тормозов быть не должно. В крайнем случае несколько миллисекунд / несколько десятков миллисекунд. И это же не то место, которое работает в длительном цикле, а только по нажатию на гиперссылку.
Так что:
Код - C# [Выбрать]
  1. try {
  2.   acDoc.SendStringToExecute("t105\n", true, false, false);
  3. } catch {};
это самое оно.
В-третьих, не нравится мне AutoCad подход - try/catch где ни попадя навешивать (как у них это например с методом Initialize сделано, и еще в паре мест).
Это ты о чем???
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Вылетает AutoCAD из-за WPF Hyperlink
« Ответ #31 : 17-11-2015, 21:29:43 »
Дома стоит AutoCad Architecture 2016 (даже не знаю зачем  :D )
Скачал, приложенный ранее проект. Сменил framework 3.5 на 4.5. Добавил ссылку на accoremgd.dll. Собрал проект, проверил в архитектурном автокаде - работает!
Либо автор что-то нам не договаривает  8) либо я даже не знаю...  ???

И все-же я повторю свой вопрос риторический - почему ошибка происходит в AcWindows.dll?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Вылетает AutoCAD из-за WPF Hyperlink
« Ответ #32 : 17-11-2015, 23:34:14 »
И все-же я повторю свой вопрос риторический - почему ошибка происходит в AcWindows.dll?
Я догадываюсь почему. Там есть командный реактор, который похоже и срабатывает на запуск команды и вызывает исключение. Командный реактор здесь особенный, который должен срабатывать на события в Ленте (Ribbon), но срабатывает похоже и на события в WPF. Почему не знаю. И честно говоря не интересно, т.к. у меня эта ошибка не воспроизводится, интернет о ней не знает и версия AutoCAD Architecture 2011 уже давно не поддерживается.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн StalsoАвтор темы

  • ADN OPEN
  • Сообщений: 30
  • Карма: 0
Re: Вылетает AutoCAD из-за WPF Hyperlink
« Ответ #33 : 18-11-2015, 08:19:41 »
Это ты о чем???

Это я о том, что проглатываются исключения в методе Initialize. У них видимо все вызовы этих методов в блоки try/catch заключены. К примеру, если написать вот такой дурацикй код :

Код - C# [Выбрать]
  1.         public void Initialize()
  2.         {
  3.             Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage("Init done\n");
  4.             List<int> m = null;
  5.             var d = m[25];
  6.         }
  7.  

То автокад загрузится и не вылетит. Если не ошибаюсь, такое поведение наблюдается еще и в реакторах (не помню, в каких именно). Я не очень понимаю, зачем это сделано, но для разработчика это сильно неудобно, когда твои исключения (пускай и дурацике, но мы же не боги, к нулевым объектам иногда бывает и обращаемся, по ошибке) проглатываются и ты о них не знаешь. Я вот например не склонен обвешивать все проверкой исключений, только те места, в которых они реально могут быть из-за пользователя, а мне приходится на этапе разработки или шаманить с настройками вижлы, или в коде вешать свои перехватчики.

Вобщем, спасибо, Александры, большое за попытки решить проблему (которая, кстати, на чистом 11 автокаде не воспроизвелась). Приятно удивлен благожелательностью

Оффлайн StalsoАвтор темы

  • ADN OPEN
  • Сообщений: 30
  • Карма: 0
Re: Вылетает AutoCAD из-за WPF Hyperlink
« Ответ #34 : 18-11-2015, 08:28:05 »
И все-же я повторю свой вопрос риторический - почему ошибка происходит в AcWindows.dll?

А черт же его знает.)))

Либо автор что-то нам не договаривает   либо я даже не знаю... 

Я чист перед вами)))) Хоть видео снять могу))

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Вылетает AutoCAD из-за WPF Hyperlink
« Ответ #35 : 18-11-2015, 11:51:14 »
Это я о том, что проглатываются исключения в методе Initialize. У них видимо все вызовы этих методов в блоки try/catch заключены. К примеру, если написать вот такой дурацикй код :

Код - C#: [Выделить]

            public void Initialize()
            {
                Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage("Init done\n");
                List<int> m = null;
                var d = m[25];
            }
     


То автокад загрузится и не вылетит.
AutoCAD загрузится или dll-сборка? Если в методе Initialize возникает исключение, то команды определённые в сборке не определяются. Так что если у тебя нетривиальный Initialize, то try/catch в нём лучше ставить самому.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн StalsoАвтор темы

  • ADN OPEN
  • Сообщений: 30
  • Карма: 0
Re: Вылетает AutoCAD из-за WPF Hyperlink
« Ответ #36 : 18-11-2015, 14:44:50 »
AutoCAD загрузится или dll-сборка? Если в методе Initialize возникает исключение, то команды определённые в сборке не определяются. Так что если у тебя нетривиальный Initialize, то try/catch в нём лучше ставить самому.

Автокад загрузится, и при это ничего мне скажет . А вот если я подобную чушь напишу в команде, то он ляжет. Такая же фигня в реакторах (в смысле того, что они проглатывают исключения, только не помню сейчас, какие именно реакторы). Мне это кучи нервов стоило, в свое время, когда я не знал этого. У меня была постобработка удаления. Я накосячил (написал collection.Single(x=>x.Id == Id), хотя в коллекции  елементов по запросу не было, в данном случае кидается экспешон ), а автокад мой косяк съел. То есть, недовыполнилась функция, нужные данные не дописались. Потом я обращаюсь к данным в совершенно другой функции (никак не связанной с удалением) и вижу какой-то треш. Я то думаю, что я где то неправильно их пишу, алгоритм не тот, в удаление и реакторы вообще не лезу, а потом оказывается, что у меня именно там косяк, не дописалось все. Вобщем не удобно. Хоть и оффтоп, но если вы меня наведете на мысль, зачем это сделано было, буду премного благодарен.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Вылетает AutoCAD из-за WPF Hyperlink
« Ответ #37 : 18-11-2015, 16:42:27 »
Автокад загрузится, и при это ничего мне скажет .
Прочитай что ты написал.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Вылетает AutoCAD из-за WPF Hyperlink
« Ответ #38 : 18-11-2015, 18:32:20 »
По поводу метода Initialize, и то, о чём я писал раньше:

Код - C# [Выбрать]
  1. using System;
  2. using Autodesk.AutoCAD.Runtime;
  3. using Autodesk.AutoCAD.ApplicationServices;
  4. using Autodesk.AutoCAD.DatabaseServices;
  5. using Autodesk.AutoCAD.Geometry;
  6. using Autodesk.AutoCAD.EditorInput;
  7. using System.Diagnostics;
  8.  
  9. [assembly: ExtensionApplication(typeof(Test.MyTest))]
  10. [assembly: CommandClass(typeof(Test.MyTest))]
  11.  
  12. namespace Test
  13. {
  14.   public class MyTest : IExtensionApplication
  15.   {
  16.     //void IExtensionApplication.Initialize()
  17.     //{
  18.     //  try {
  19.     //    throw new Autodesk.AutoCAD.Runtime.Exception(ErrorStatus.NotImplementedYet);
  20.     //  } catch (Autodesk.AutoCAD.Runtime.Exception ex) {
  21.     //    Debug.Write(ex.ToString());
  22.     //  }
  23.     //}
  24.     //////////////////////////////////////////////////////////////////////////
  25.     // Если Initialize не перехватит Exception, то ни одна из
  26.     // команд, определённых в этом модуле не будет видна в AutoCAD,
  27.     // хотя сообщение об ошибке загрузки этого модуля не будет    
  28.     //////////////////////////////////////////////////////////////////////////
  29.     void IExtensionApplication.Initialize()
  30.     {
  31.       throw new Autodesk.AutoCAD.Runtime.Exception(ErrorStatus.NotImplementedYet);
  32.     }
  33.  
  34.     void IExtensionApplication.Terminate() { }
  35.  
  36.     [CommandMethod("MyCommand")]
  37.     public void MyCommand()
  38.     {
  39.       Document doc = Application.DocumentManager.MdiActiveDocument;
  40.       if (doc == null) return;
  41.       Editor ed = doc.Editor;
  42.       ed.WriteMessage("\nПроверка!");
  43.     }
  44.   }
  45. }

Так это выглядит при одном и втором вариантах Initialize:

Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн StalsoАвтор темы

  • ADN OPEN
  • Сообщений: 30
  • Карма: 0
Re: Вылетает AutoCAD из-за WPF Hyperlink
« Ответ #39 : 19-11-2015, 16:11:04 »
Прочитай что ты написал.

Гм, так я это и имел ввиду. То, про что ваше видео. Наверное плохо изъяснился. Попробую еще раз. Вот в вашем видео видно, что вы самостоятельно должны ловить исключение в методе Initialize. А Автокад никак вам в этом не поможет. Хоть у вас и ошибка, которая генерирует исключение, он спокойненько выполнит команду _netload, и мало того, что не сляжет от необработанной ошибки (как в моем примере, в котором я к нулевому списку обратился), так  и ничего вам об этом исключении не сообщит. Вообще. Самому надо ловить. При этом, если вы допустите исключительную ситуацию в коде команды (опять же, как в моем примере, когда я к нулевому массиву обращаюсь), то он, как порядочная программа, вылетит. То есть, мы имеем две разные реакции на исключительные ситуации, порождаемые сторонними плагинами.  Так ладно метод Initialize, там программисту легко понять, что он ошибся, ибо команды не запускаются, а вот когда подобное происходит в реакторах, то я вообще не знаю ничего про исключение. Оно ловится автокадом и все. В итоге, мне приходится в процессе разработки вешать на  ВЕСЬ код реактора свой try/catch, чтобы как-то быть в курсе своих ошибок. А потом его убирать, по окончанию разработки плагина. А я привык блоки try/catch вешать только там, где пользователь может сгенерировать исключительную ситуацию, а не я сам. Либо совсем уж в узких местах. Как-то так.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Вылетает AutoCAD из-за WPF Hyperlink
« Ответ #40 : 19-11-2015, 16:21:21 »
А я привык блоки try/catch вешать только там, где пользователь может сгенерировать исключительную ситуацию, а не я сам.
Реактор, это такая хитрая штука, что отсутствие обработчика в большинстве случаев приводит не просто к исключению, а к аварийному завершению AutoCAD.
Причем если в catch еще и что-то делать (например выводить сообщение и что-то у пользователя спрашивать), то это будет еще хуже, так как реактор может выполнится повторно. Поэтому они поставили свои try/catch с пустым catch.

Впрочем, это всё пустой разговор. Нужно знать как это работает в AutoCAD и под это подстраиваться. Другого поведения не будет, так как это не баг, а специфическое поведение.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн StalsoАвтор темы

  • ADN OPEN
  • Сообщений: 30
  • Карма: 0
Re: Вылетает AutoCAD из-за WPF Hyperlink
« Ответ #41 : 19-11-2015, 16:39:32 »
Реактор, это такая хитрая штука, что отсутствие обработчика в большинстве случаев приводит не просто к исключению, а к аварийному завершению AutoCAD.
Причем если в catch еще и что-то делать (например выводить сообщение и что-то у пользователя спрашивать), то это будет еще хуже, так как реактор может выполнится повторно. Поэтому они поставили свои try/catch с пустым catch.

Впрочем, это всё пустой разговор. Нужно знать как это работает в AutoCAD и под это подстраиваться. Другого поведения не будет, так как это не баг, а специфическое поведение.

Ну да, имеем то, что имеем. Хорошо хоть какое API есть