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

05/08/2017

В AutoCAD 2018.1 метод UpgradeOpen приводит к фатальной ошибке внутри транзакции

Вопрос: Я обнаружил, что если использовать метод UpgradeOpen внутри транзакции, в которой этот объект открыт для чтения, то это приводит к фатальной ошибке. Пример кода, приводящий к такой ошибке:

Код - C#: [Выделить]
  1. using (Transaction tr = db.TransactionManager.StartTransaction())
  2. {
  3.   LayerTable lt = tr.GetObject(db.LayerTableId, OpenMode.ForWrite);
  4.   foreach (ObjectId LayId in lt)
  5.   {
  6.       LayerTableRecord lay = tr.GetObject(LayId, OpenMode.ForRead);
  7.       if (lay.IsDependent)
  8.       {
  9.           lay.UpgradeOpen();
  10.           lay.IsLocked = true;
  11.           lay.IsFrozen = true;
  12.       }
  13.   }
  14.   tr.Commit();
  15. }

В предыдущих версиях AutoCAD и в AutoCAD 2018 до 2018.1 этот код нормально работал. Что не так?

Ответ: Метод UpgradeOpen () - это оболочка для C ++ метода AcDbObject::upgradeOpen (), которая предназначена для механизма open/close, а не для механизма транзакций. Поскольку вы работаете с транзакцией и это не транзакция open/close, вместо использования UpgradeOpen () вы должны сделать еще один вызов tr.GetObject (), но делайте его с OpenMode.ForWrite а не с OpenMode.ForRead. Таким образом, открытый для записи объект будет частью транзакции.

Смешение механизмов open/close с обычными транзакциями для одного и того же объекта одновременно является ненадежным и может привести к проблемам, описанным выше.

Если заменить db.TransactionManager.StartTransaction() на db.TransactionManager.StartOpenCloseTransaction(), то можно безболезненно использовать UpgradeOpen с объектом, открытым в такой транзакции.

Если перед завершением обычной транзакции вызвать DowngradeOpen, для объекта, для которого вызывали UpgradeOpen, то это тоже предотвращает фатальную ошибку.

 

Источник: https://forums.autodesk.com/t5/net/api-bug-2018-1-causes-crash-using-upgradeopen-on-dependent/m-p/7275113

Автор: Александр Ривилис

Обсуждение: http://adn-cis.org/forum/index.php?topic=7943

Опубликовано 05.08.2017