Ошибка в методе StartTransaction. Как такое может быть?

Автор Тема: Ошибка в методе StartTransaction. Как такое может быть?  (Прочитано 10827 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Здравствуйте!
Сегодня получил отчёт об ошибке от пользователя, вот такой вот стек:
************** Текст исключения **************
System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта.
   в Autodesk.AutoCAD.Runtime.Interop.CheckNull(IntPtr returnValue)
   в Autodesk.AutoCAD.ApplicationServices.TransactionManager.StartTransaction()
   в Iteris.AutoCAD.Details.AutoCAD.PasteTableCmd.RunPasteTable()
   в Autodesk.AutoCAD.Runtime.CommandClass.InvokeWorker(MethodInfo mi, Object commandObject, Boolean bLispFunction)
   в Autodesk.AutoCAD.Runtime.CommandClass.InvokeWorkerWithExceptionFilter(MethodInfo mi, Object commandObject, Boolean bLispFunction)
   в Autodesk.AutoCAD.Runtime.CommandClass.CommandThunk.Invoke()
То есть, в командном методе при попытке запустить транзакцию вываливается исключение.
Я, честно говоря, не понимаю: как такое может быть и что в моём коде могло к такому привести? Или же мой код тут не при чём? И главное - как с этим бороться?
Приветствую любые идеи, даже самые безумные :D потому как у меня полный ступор - я с таким никогда не сталкивался.
Ладно бы в метод передавались параметры, но тут метод без параметров и вдруг "нульреференсэксцепшн"...

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Нет активного документа/базы и соответственно TransactionManager == null

// Autodesk.AutoCAD.DatabaseServices.TransactionManager
using Autodesk.AutoCAD.Runtime;
using System;

Код - C# [Выбрать]
  1. public unsafe virtual Transaction StartTransaction()
  2. {
  3.         //IL_000d: Expected I, but got I8
  4.         AcDbTransactionManager* impObj = GetImpObj();
  5.         AcTransaction* value = (AcTransaction*)/*OpCode not supported: CallIndirect*/;
  6.         IntPtr returnValue = new IntPtr(value);
  7.         Autodesk.AutoCAD.Runtime.Interop.CheckNull(returnValue); // <- исключение тут
  8.         // Соответственно TransactionManager == null
  9.         IntPtr unmanagedPointer = new IntPtr(value);
  10.         return new Transaction(unmanagedPointer, true);
  11. }
  12.  


Кстати, references шли на dll-ки из ObjectARX SDK правильной версии и Copy Local установлен в False?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Нет активного документа/базы и соответственно TransactionManager == null
Так ведь это же команда - она не запустится, если нет документа. К тому же, у меня в коде идёт проверка полученных Document, Database и Editor. Транзакцию я запускаю через базу:
Код - C# [Выбрать]
  1. using (Transaction tr = db.TransactionManager.StartTransaction())
  2. {
  3.  
Если бы база была бы null, я так понимаю, что NRE было бы просто в Iteris.AutoCAD.Details.AutoCAD.PasteTableCmd.RunPasteTable(), а оно происходит уже внутри StartTransaction(), то есть метод запускается, а раз запускается - значит база не null. Или нет?
Кстати, references шли на dll-ки из ObjectARX SDK правильной версии и Copy Local установлен в False?
Да, проверил, с ними всё в порядке. Там вообще загрузка из Bundle-пакета, который формируется инсталятором - туда ничего лишнего не попадает. А ссылки да, идут на правильные версии...

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Дмитрий Загорулькин,
Ну тогда похоже что к моменту этого исключения AutoCAD уже разрушился и не может стартовать транзакцию. Ну например нет места на диске для временных файлов или слишком много файлов в каталоге (давно не чистили %TEMP%)
У тебя же этот код работает нормально?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн bender

  • ADN Club
  • **
  • Сообщений: 62
  • Карма: 4
А АКАД какой? У меня похожая проблема на нескольких компах с 2015-м имеет место. Те же самые программы под 2013-й и 2017-й нормально работают.

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Ну тогда похоже что к моменту этого исключения AutoCAD уже разрушился и не может стартовать транзакцию. Ну например нет места на диске для временных файлов или слишком много файлов в каталоге (давно не чистили %TEMP%)
Места на диске свободно чуть больше 300 Гб. А вот про темпы интересная мысль! Но, вроде как, на той машине относительно недавно переустанавливали всю систему, так что, шансов мало, что там уже всё забито. Но проверю, спасибо!
У тебя же этот код работает нормально?
Да, нормально. Но и у пользователя, как я понял, не сразу ошибка выскакивает, а после нескольких минут работы, причём, в рандомный момент и не обязательно именно в этой команде. У меня два отчёта - в них разные команды, но обе споткнулись на запуске транзакции.
А АКАД какой? У меня похожая проблема на нескольких компах с 2015-м имеет место. Те же самые программы под 2013-й и 2017-й нормально работают.
Civil 3D 2017 со всеми последними обновлениями.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Дмитрий Загорулькин,
Из спортивного интереса попробуй с OpenCloseTransaction.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Да там как обычно... Чертёж надо сделать "ещё вчера". Автокад вылетает, приложение выкидывет исключения. Если я ещё приду с предложением "а давайте немного поэкспериментируем" - боюсь, что меня казнят  :-\

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Да там как обычно... Чертёж надо сделать "ещё вчера". Автокад вылетает, приложение выкидывет исключения. Если я ещё приду с предложением "а давайте немного поэкспериментируем" - боюсь, что меня казнят  :-\
Это может быть специфика Civil 3D.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Допрос с пристрастием дал результат 8)
Ситуация такая - у пользователя запущено два Civil 3D одновременно (а может и больше). В одном из них случился фатал. И похоже, что это повлияло на другой - в нём стала выскакивать такая ошибка. Так что, похоже, что это действительно просто следствие глобального сбоя. Может такое быть?

Отмечено как Решение Дмитрий Загорулькин 21-06-2019, 13:11:53

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Может такое быть?
Вполне возможно. Более того я бы категорически не рекомендовал запускать одновременно два AutoCAD (а тем более Civil 3D). Даже программисты Autodesk не всегда могут спрогнозировать к чему это приведёт, а обычный пользователь и подавно. Если ему уж очень нужно, то пусть открывает несколько документов в одном AutoCAD/Civil 3d.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Ну там как раз такая логика, что если все документы открывать в одном AutoCAD, то при фатале они все закроются. А тут - один сфаталил, с другими можно работать. Раньше у них, вроде, проблем с этим не было.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Однозначно, что если запущены два или более AutoCAD (или вертикалок) и работа идёт через COM/ActiveX (а это не всегда известно, даже если кажется, что всё работает через .NET), то будут проблемы, связанные с неоднозначностью хоста.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Пожалуй, Вы правы. Я передал пользователям Ваше предупреждение со ссылкой на эту тему.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Пожалуй, Вы правы. Я передал пользователям Ваше предупреждение со ссылкой на эту тему.
Вообще-то идеального решения нет. Как минимум если они запускают несколько Civil'ов, то после Fatal Error в одном из них - нужно перезапускать ВСЕ!
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение