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

ADN Club => AutoCAD .NET API => Тема начата: Stalso от 17-11-2015, 13:17:02

Название: Вылетает AutoCAD из-за WPF Hyperlink
Отправлено: Stalso от 17-11-2015, 13:17:02
Здравствуйте. Может кто сталкивался. Есть обычное диалоговое окно WPF вызванное из команды. На нем помещена гиперссылка (уже тестовое окно сделал с гиперссылкой одной, для чистоты эксперимента). Разметка XAML следующая:

Код - XML [Выбрать]
  1.  <TextBlock>
  2.     <Hyperlink  Click="mistakeClick" >                                            
  3.          <TextBlock Text="SomeText" />
  4.     </Hyperlink>                                        
  5. </TextBlock>
  6.  

На клик по ссылке у меня повешен обработчик, вызывающий команду AutoCAD (команда тестовая, вообще ничего не делает, ни к чертежу, ни к чему либо еще не обращается, просто вызывается):

Код - C# [Выбрать]
  1.  private void mistakeClick(object sender, RoutedEventArgs e)
  2.  {
  3.       Document acDoc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
  4.       // Exception on this line
  5.       acDoc.SendStringToExecute("t105\n", true, false, false);            
  6.  }
  7.  

И на вызов SendStringToExecute у меня вылетает NullReference исключение вот с такими параметрами:

Source : AcWindows
TargetSite : {Autodesk.Windows.RibbonItem FindNearestRibbonItem(System.Windows.DependencyObject)}
StackTrace :  в Autodesk.AutoCAD.Internal.Windows.RibbonSelectionManager.FindNearestRibbonItem(DependencyObject e)   
                      в Autodesk.AutoCAD.Internal.Windows.RibbonSelectionManager.CommandThroat_InputCharactersQueued(Object sender, InputCharactersQueuedEventArgs e)   
                      в Autodesk.AutoCAD.Internal.Windows.MyCmdThroatReactor.charsStuffed(MyCmdThroatReactor* , AcApDocument* sender, Char* str)
                      в EnsureUnmanagedStackFrameForOem<class AcApDocManager *,enum Acad::ErrorStatus (__cdecl AcApDocManager::*)(class AcApDocument *,wchar_t const *,bool,bool,bool),class AcApDocument *,wchar_t const *,bool,bool,bool>(AcApDocManager* , $PTMType$P8AcApDocManager@@EAA?AW4ErrorStatus@Acad@@PEAVAcApDocument@@PEB_W_N22@Z , AcApDocument* , Char* , Boolean , Boolean , Boolean )
                     в Autodesk.AutoCAD.ApplicationServices.Document.SendStringToExecute(String command, Boolean activate, Boolean wrapUpInactiveDoc, Boolean echoCommand)
                     в MISAE.Core.TestWindow.mistakeClick(Object sender, RoutedEventArgs e) в E:\\m\\MISAELibrary\\WpfControls\\TestWindow.xaml.cs:строка 267

Это исключение выкидывается до того, как приложение зайдет в CommandWillStartReactor для этой команды. Причем если его словить, то команда таки выполняется. Ума не приложу, в чем дело. AutoCAD 2011.
Название: Re: Вылетает AutoCAD из-за WPF Hyperlink
Отправлено: Александр Пекшев aka Modis от 17-11-2015, 13:29:23
А как вызывается само окно в автокаде? Код давайте
Название: Re: Вылетает AutoCAD из-за WPF Hyperlink
Отправлено: Stalso от 17-11-2015, 13:36:02
Баг воспроизводится, когда окно вызывается просто из другой команды. Но изначально я его заметил, когда окно вызывалось из другого окна. Вот код, как я его вызываю
Код - C# [Выбрать]
  1.  [CommandMethod("t078", CommandFlags.UsePickSet)]
  2.  public void t078()
  3.  {
  4.      TestWindow wnd = new TestWindow();
  5.      wnd.Show();
  6.  }
  7.  

Проверял, делал окно и модальным и не модальным.
Название: Re: Вылетает AutoCAD из-за WPF Hyperlink
Отправлено: Александр Пекшев aka Modis от 17-11-2015, 13:50:18
Для начала: самое первое окно (главное окно функции вашей) нужно открывать не как обычное окно, а через специальные методы автокада - Autodesk.AutoCAD.ApplicationServices.Application.ShowModelessWindow и Autodesk.AutoCAD.ApplicationServices.Application.ShowModalWindow
Все последующие окна, открываемые из первого, уже можно открывать как обычные
Далее: если у вас модальное окно (я постоянно путаю названия =) То, которое блокирует автокад), то нужно перед вызовом какой-либо команды его сворачивать (win.Hide()), и затем снова показывать (win.Show()). Причем нужно учесть, что может произойти ошибка и окно не покажется опять - это тоже нужно учитывать
Название: Re: Вылетает AutoCAD из-за WPF Hyperlink
Отправлено: Stalso от 17-11-2015, 14:03:18
Да со свертыванием окон - это ж не совсем другая история)) И команда у меня же тестовая. Но для чистоты эксперимента проверил и Autodesk.AutoCAD.ApplicationServices.Application.ShowModelessWindow и Autodesk.AutoCAD.ApplicationServices.Application.ShowModalWindow. Баг воспроизводится.
Название: Re: Вылетает AutoCAD из-за WPF Hyperlink
Отправлено: Александр Пекшев aka Modis от 17-11-2015, 14:26:53
Чет я сразу не заметил - если из окна вызывать SendStringToExecute, то вариант свернуть/развернуть не прокатит. Только закрывать окно совсем. А иначе там должна быть именно ваша функция вызываемая как обычный метод. Думаю конечно можно использовать события начала и окончания функции, но это заморочки
И вот еще что - ваша ошибка:
Цитировать
Autodesk.Windows.RibbonItem FindNearestRibbonItem(System.Windows.DependencyObject)
А вы уверены, что ошибка-то в окне? Пробовали заменить тестовую функцию на, например, функцию "отрезок"?:
Код - C# [Выбрать]
  1. acDoc.SendStringToExecute("_LINE ", true, false, false);
Название: Re: Вылетает AutoCAD из-за WPF Hyperlink
Отправлено: Stalso от 17-11-2015, 15:10:23
Чет я сразу не заметил - если из окна вызывать SendStringToExecute, то вариант свернуть/развернуть не прокатит. Только закрывать окно совсем. А иначе там должна быть именно ваша функция вызываемая как обычный метод. Думаю конечно можно использовать события начала и окончания функции, но это заморочки

Само собой, это ж тестовый пример. Обычно я так делаю на закрытие окна. То есть, сделали в окне манипуляции, нажали кнопку ОК - вызвали команду, закрыли окно. Да я сто раз так делал. Чтобы совсем корректный экперимент сделать, я поменял код обработчика вот так:

Код - C# [Выбрать]
  1.         private void mistakeClick(object sender, RoutedEventArgs e)
  2.         {
  3.             Document acDoc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
  4.             try
  5.             {
  6.                
  7.                 acDoc.SendStringToExecute("_LINE\n", true, false, false);
  8.                 this.Close();
  9.             }
  10.             catch (Exception ex)
  11.             {
  12.                 this.Close();
  13.             }        
  14.         }
  15.  

Затем на самом окне создал кнопку (помимо гиперссылки). И навесил на кнопку тот же самый обработчик. При нажатии на кнопку - все ОК. На гиперссылку - беда, вылетает исключение. И кстати, прокатывает вполне вариант свернуть окно -> вызвать команду, если сделать вот так (тоже сто раз так делал ;)):

Код - C# [Выбрать]
  1.         private void mistakeClick(object sender, RoutedEventArgs e)
  2.         {
  3.             Document acDoc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
  4.             try
  5.             {
  6.                
  7.                 acDoc.SendStringToExecute("_LINE\n", true, false, false);
  8.                 this.WindowState = WindowState.Minimized;
  9.                 Autodesk.AutoCAD.Internal.Utils.SetFocusToDwgView();
  10.  
  11.             }
  12.             catch (Exception ex)
  13.             {
  14.                 this.Close();
  15.             }        
  16.         }
  17.  

Если хочется окно опять развернуть, то можно запомнить его объект в синглтоне каком-нибудь и по окончанию работы команды, развернуть его обратно. Но не суть. У нас тут другая проблема, гиперссылка не работает, во дела))
Название: Re: Вылетает AutoCAD из-за WPF Hyperlink
Отправлено: Александр Ривилис от 17-11-2015, 15:32:06
Значение acDoc проверял? Оно не null?
Название: Re: Вылетает AutoCAD из-за WPF Hyperlink
Отправлено: Александр Пекшев aka Modis от 17-11-2015, 15:34:17
Stalso, выложи свой тестовый проект, где у тебя в окне кнопка и гиперссылка. А мы проверим))
Желательно, чтобы только код с этой проблемой ;)
Название: Re: Вылетает AutoCAD из-за WPF Hyperlink
Отправлено: Александр Ривилис от 17-11-2015, 15:35:23
Желательно, чтобы только код с этой проблемой ;)
Не желательно, а обязательно. Т.е. сделать отдельный тестовый пример для проверки.
Название: Re: Вылетает AutoCAD из-за WPF Hyperlink
Отправлено: Stalso от 17-11-2015, 15:40:08
Значение acDoc проверял? Оно не null?

Проверял, не null.

Не желательно, а обязательно. Т.е. сделать отдельный тестовый пример для проверки.

Обязательно запилю. Я то без гиперссылок могу обойтись, но мне интересно просто.
Название: Re: Вылетает AutoCAD из-за WPF Hyperlink
Отправлено: Александр Ривилис от 17-11-2015, 15:48:12
Проверял, не null.
Попробуй запускать через ((AcadDocument)acDoc.AcadDocument).SendCommand("t105\n");
Название: Re: Вылетает AutoCAD из-за WPF Hyperlink
Отправлено: Stalso от 17-11-2015, 16:32:34
((AcadDocument)acDoc.AcadDocument).SendCommand("t105\n");

Не помогает. Вот накидал тестовый изолированнный пример, на котором баг воспроизводится
Название: Re: Вылетает AutoCAD из-за WPF Hyperlink
Отправлено: Александр Пекшев aka Modis от 17-11-2015, 16:44:17
Выложенный проект сработал в обоих случая одинаково - без ошибок...
НО! Я так и не понял - под какой какую версию автокада пишется проект? Я пробовал на 2010
Просто в ссылках я увидел System.Xaml, но при этом у проекта в настройках стоял .Net framework 3.5 (которому эта ссылка не нужна...)
Название: Re: Вылетает AutoCAD из-за WPF Hyperlink
Отправлено: Stalso от 17-11-2015, 16:54:49
Выложенный проект сработал в обоих случая одинаково - без ошибок...
НО! Я так и не понял - под какой какую версию автокада пишется проект? Я пробовал на 2010
Просто в ссылках я увидел System.Xaml, но при этом у проекта в настройках стоял .Net framework 3.5 (которому эта ссылка не нужна...)

Гм, странно, у меня воспроизводится. Делался он для 2011 версии. Если уж совсем точно, то для 2011 версии архитектурного автокада.  А ссылка осталась, когда забыл версию компилятора поменять, создавая проект в 2015 вижле. Неужели оба раза выпала табличка "Все отлично"?
Название: Re: Вылетает AutoCAD из-за WPF Hyperlink
Отправлено: Александр Пекшев aka Modis от 17-11-2015, 16:56:17
Гм, странно, у меня воспроизводится. Делался он для 2011 версии. Если уж совсем точно, то для 2011 версии архитектурного автокада.  А ссылка осталась, когда забыл версию компилятора поменять, создавая проект в 2015 вижле
Так зачем тогда Net framework 3.5??? Поставьте 4.0 и проверьте
Название: Re: Вылетает AutoCAD из-за WPF Hyperlink
Отправлено: Stalso от 17-11-2015, 17:00:28
Так зачем тогда Net framework 3.5??? Поставьте 4.0 и проверьте

Ну у меня 3.5 стоит, проблему то это не убирает, верно? Тем более, я грешным делом думал, что не покатит 4 фреймворк для 2011. Вернее покатит, но если раскомментить строчки в acad.exe.config. А это не круто, мы же не рассчитываем, что пользователь плагина такой фигней маятся будет?
Название: Re: Вылетает AutoCAD из-за WPF Hyperlink
Отправлено: Александр Ривилис от 17-11-2015, 17:08:04
Ну у меня 3.5 стоит, проблему то это не убирает, верно?
Твой пример с .NET 3.5 у меня вообще отказался компилироваться из-за System.Xaml, которого в 3.5 нет
С версией .NET 4.0 я проверил в AutoCAD 2011 и 2012 - всё нормально работает. Никаких ошибок нет.
Название: Re: Вылетает AutoCAD из-за WPF Hyperlink
Отправлено: Александр Ривилис от 17-11-2015, 17:13:18
Убрал лишнее и проверил под .NET 3.5 с AutoCAD 2011 - никаких ошибок.
Название: Re: Вылетает AutoCAD из-за WPF Hyperlink
Отправлено: Stalso от 17-11-2015, 17:22:30
Убрал лишнее и проверил под .NET 3.5 с AutoCAD 2011 - никаких ошибок.

Не понимаю тогда что за чудеса. Я тоже все вычистил и все равно, вот. Может у меня поселился гремлин?)) Или дело в архитектурном автокаде? Гм. А какие по дефолту должны быть настройки в acad.exe.config?
Название: Re: Вылетает AutoCAD из-за WPF Hyperlink
Отправлено: Александр Пекшев aka Modis от 17-11-2015, 17:30:28
Stalso, во-первых - проверь через пошаговую отладку
во-вторых - лучше пиши конкретно какую Exception ловишь (я пишу обычно System.Exception)
в-третьих - судя по скрину проблема таки не с автокадом связана
в четвертых - если ставишь framework 4.0, то System.Xaml (не System.Xml) нужна, если 3.5 - не нужна

и почему у тебя ошибка в AcWindows??? O_o
Название: Re: Вылетает AutoCAD из-за WPF Hyperlink
Отправлено: Александр Ривилис от 17-11-2015, 17:36:46
Возможно дело в AutoCAD Architecture, возможно в VS 2015 (менее вероятно) - я использовал VS 2010.
Начни с того, что убедись, что у тебя установлены все обновления на AA: https://knowledge.autodesk.com/support/autocad-architecture/downloads?release=2011
Название: Re: Вылетает AutoCAD из-за WPF Hyperlink
Отправлено: Stalso от 17-11-2015, 17:38:38
talso, во-первых - проверь через пошаговую отладку
во-вторых - лучше пиши конкретно какую Exception ловишь (я пишу обычно System.Exception)
в-третьих - судя по скрину проблема таки не с автокадом связана

Так я написал вроде какой Exception (автокад кидает). И stack trace привел. Да и на скрине видно, что происходит. И скрин с пошаговой отладки сделан. Что за бред с этой гиперссылкой? Ладно, покурю, вам расскажу)) Завтра под рукой будет чистый 2011 кад, тестану в нем. Или может кто-чего найдет. У меня пока мыслей нет. Приведите пожалуйста настройки acad.exe.config. У меня вот такие

Код - XML [Выбрать]
  1. <configuration>
  2.   <startup>
  3.     <supportedRuntime version="v2.0.50727"/>
  4.   </startup>
  5. </configuration>
  6.  

Что-то вообще аж вторая стоит.
Название: Re: Вылетает AutoCAD из-за WPF Hyperlink
Отправлено: Stalso от 17-11-2015, 17:40:36
Возможно дело в AutoCAD Architecture, возможно в VS 2015 (менее вероятно) - я использовал VS 2010.
Начни с того, что убедись, что у тебя установлены все обновления на AA: https://knowledge.autodesk.com/support/autocad-architecture/downloads?release=2011

Гляну. Сомневаюсь, что все обновления. К сожалению, реалии таковы, что специально приходится тестить на необновленных, калечных версиях. С торрентов паки качаем и на них тестим. Такого уже насмотрелись...
Название: Re: Вылетает AutoCAD из-за WPF Hyperlink
Отправлено: Александр Ривилис от 17-11-2015, 17:44:54
Приведите пожалуйста настройки acad.exe.config.
AutoCAD 2011 (нетронутый вариант config-файла)
Код - XML [Выбрать]
  1. <configuration>
  2.  
  3. <!--
  4.  <startup useLegacyV2RuntimeActivationPolicy="true">
  5.    <supportedRuntime version="v4.0"/>
  6.  </startup>
  7. -->  
  8.  
  9. <!--All assemblies in AutoCAD are fully trusted so there's no point generating publisher evidence-->
  10.    <runtime>        
  11.         <generatePublisherEvidence enabled="false"/>    
  12.    </runtime>
  13. </configuration>

P.S.: Кстати, а как насчет установки CopyLocal в False и использование dll-файлов из каталога inc в составе ObjectARX SDK 2011 ?
Название: Re: Вылетает AutoCAD из-за WPF Hyperlink
Отправлено: Stalso от 17-11-2015, 17:57:57
P.S.: Кстати, а как насчет установки CopyLocal в False и использование dll-файлов из каталога inc в составе ObjectARX SDK 2011 ?

Все установлено в false. А библиотеки все из ObjectArx.
Название: Re: Вылетает AutoCAD из-за WPF Hyperlink
Отправлено: Александр Ривилис от 17-11-2015, 18:06:13
А библиотеки все из ObjectArx.
Да ну? А это что тогда:
Код - XML [Выбрать]
  1.    <Reference Include="acdbmgd">
  2.       <HintPath>..\..\..\..\..\..\..\Program Files\Autodesk\AutoCAD Architecture 2011\acdbmgd.dll</HintPath>
  3.       <Private>False</Private>
  4.     </Reference>
  5.     <Reference Include="acmgd">
  6.       <HintPath>..\..\..\..\..\..\..\Program Files\Autodesk\AutoCAD Architecture 2011\acmgd.dll</HintPath>
  7.       <Private>False</Private>
  8.     </Reference>
  9.     <Reference Include="AdWindows">
  10.       <HintPath>..\..\..\..\..\..\..\Program Files\Autodesk\AutoCAD Architecture 2011\AdWindows.dll</HintPath>
  11.       <Private>False</Private>
  12.     </Reference>
Название: Re: Вылетает AutoCAD из-за WPF Hyperlink
Отправлено: Stalso от 17-11-2015, 18:09:14
Да ну? А это что тогда:
Код - XML: [Выделить]
   <Reference Include="acdbmgd">
      <HintPath>..\..\..\..\..\..\..\Program Files\Autodesk\AutoCAD Architecture 2011\acdbmgd.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="acmgd">
      <HintPath>..\..\..\..\..\..\..\Program Files\Autodesk\AutoCAD Architecture 2011\acmgd.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="AdWindows">
      <HintPath>..\..\..\..\..\..\..\Program Files\Autodesk\AutoCAD Architecture 2011\AdWindows.dll</HintPath>
      <Private>False</Private>
    </Reference>

Ну в смысле поменял, перепроверил (а то, что первоначально проверил не на тех AcDbMgd - каюсь). Также проверил под 3.5 с дефолтными настройками acad.exe.config,  под 4.0, 4.5 и т.д (точно с правильными *.dll). Ловит Exception, гад, и все тут. Наверное таки в версии автокада дело. Ужас какой(((
Название: Re: Вылетает AutoCAD из-за WPF Hyperlink
Отправлено: Александр Ривилис от 17-11-2015, 18:13:21
В конце концов команда, как я понял, у тебя запускается в любом случае. Так в чем проблема?
Название: Re: Вылетает AutoCAD из-за WPF Hyperlink
Отправлено: Stalso от 17-11-2015, 18:20:49
В конце концов команда, как я понял, у тебя запускается в любом случае. Так в чем проблема?

Ну, во первых интересно. Во-вторых - тормозит, когда Exception ловит,заметно причем. В-третьих, не нравится мне AutoCad подход - try/catch где ни попадя навешивать (как у них это например с методом Initialize сделано, и еще в паре мест).
Название: Re: Вылетает AutoCAD из-за WPF Hyperlink
Отправлено: Александр Ривилис от 17-11-2015, 21:16:05
Во-вторых - тормозит, когда Exception ловит,заметно причем
В этом месте никаких тормозов быть не должно. В крайнем случае несколько миллисекунд / несколько десятков миллисекунд. И это же не то место, которое работает в длительном цикле, а только по нажатию на гиперссылку.
Так что:
Код - C# [Выбрать]
  1. try {
  2.   acDoc.SendStringToExecute("t105\n", true, false, false);
  3. } catch {};
это самое оно.
В-третьих, не нравится мне AutoCad подход - try/catch где ни попадя навешивать (как у них это например с методом Initialize сделано, и еще в паре мест).
Это ты о чем???
Название: Re: Вылетает AutoCAD из-за WPF Hyperlink
Отправлено: Александр Пекшев aka Modis от 17-11-2015, 21:29:43
Дома стоит AutoCad Architecture 2016 (даже не знаю зачем  :D )
Скачал, приложенный ранее проект. Сменил framework 3.5 на 4.5. Добавил ссылку на accoremgd.dll. Собрал проект, проверил в архитектурном автокаде - работает!
Либо автор что-то нам не договаривает  8) либо я даже не знаю...  ???

И все-же я повторю свой вопрос риторический - почему ошибка происходит в AcWindows.dll?
Название: Re: Вылетает AutoCAD из-за WPF Hyperlink
Отправлено: Александр Ривилис от 17-11-2015, 23:34:14
И все-же я повторю свой вопрос риторический - почему ошибка происходит в AcWindows.dll?
Я догадываюсь почему. Там есть командный реактор, который похоже и срабатывает на запуск команды и вызывает исключение. Командный реактор здесь особенный, который должен срабатывать на события в Ленте (Ribbon), но срабатывает похоже и на события в WPF. Почему не знаю. И честно говоря не интересно, т.к. у меня эта ошибка не воспроизводится, интернет о ней не знает и версия AutoCAD Architecture 2011 уже давно не поддерживается.
Название: Re: Вылетает AutoCAD из-за WPF Hyperlink
Отправлено: Stalso от 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 автокаде не воспроизвелась). Приятно удивлен благожелательностью
Название: Re: Вылетает AutoCAD из-за WPF Hyperlink
Отправлено: Stalso от 18-11-2015, 08:28:05
И все-же я повторю свой вопрос риторический - почему ошибка происходит в AcWindows.dll?

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

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

Я чист перед вами)))) Хоть видео снять могу))
Название: Re: Вылетает AutoCAD из-за WPF Hyperlink
Отправлено: Александр Ривилис от 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 в нём лучше ставить самому.
Название: Re: Вылетает AutoCAD из-за WPF Hyperlink
Отправлено: Stalso от 18-11-2015, 14:44:50
AutoCAD загрузится или dll-сборка? Если в методе Initialize возникает исключение, то команды определённые в сборке не определяются. Так что если у тебя нетривиальный Initialize, то try/catch в нём лучше ставить самому.

Автокад загрузится, и при это ничего мне скажет . А вот если я подобную чушь напишу в команде, то он ляжет. Такая же фигня в реакторах (в смысле того, что они проглатывают исключения, только не помню сейчас, какие именно реакторы). Мне это кучи нервов стоило, в свое время, когда я не знал этого. У меня была постобработка удаления. Я накосячил (написал collection.Single(x=>x.Id == Id), хотя в коллекции  елементов по запросу не было, в данном случае кидается экспешон ), а автокад мой косяк съел. То есть, недовыполнилась функция, нужные данные не дописались. Потом я обращаюсь к данным в совершенно другой функции (никак не связанной с удалением) и вижу какой-то треш. Я то думаю, что я где то неправильно их пишу, алгоритм не тот, в удаление и реакторы вообще не лезу, а потом оказывается, что у меня именно там косяк, не дописалось все. Вобщем не удобно. Хоть и оффтоп, но если вы меня наведете на мысль, зачем это сделано было, буду премного благодарен.
Название: Re: Вылетает AutoCAD из-за WPF Hyperlink
Отправлено: Александр Ривилис от 18-11-2015, 16:42:27
Автокад загрузится, и при это ничего мне скажет .
Прочитай что ты написал.
Название: Re: Вылетает AutoCAD из-за WPF Hyperlink
Отправлено: Александр Ривилис от 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:

Название: Re: Вылетает AutoCAD из-за WPF Hyperlink
Отправлено: Stalso от 19-11-2015, 16:11:04
Прочитай что ты написал.

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

Впрочем, это всё пустой разговор. Нужно знать как это работает в AutoCAD и под это подстраиваться. Другого поведения не будет, так как это не баг, а специфическое поведение.
Название: Re: Вылетает AutoCAD из-за WPF Hyperlink
Отправлено: Stalso от 19-11-2015, 16:39:32
Реактор, это такая хитрая штука, что отсутствие обработчика в большинстве случаев приводит не просто к исключению, а к аварийному завершению AutoCAD.
Причем если в catch еще и что-то делать (например выводить сообщение и что-то у пользователя спрашивать), то это будет еще хуже, так как реактор может выполнится повторно. Поэтому они поставили свои try/catch с пустым catch.

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

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