Обойдемся без Autodesk:
1) Берем acdbmgd.dll и утилиту ILSpy.
2) Исследуем класс DBObject.
3) Находим его метод Dispose
4) Убеждаемся, что в конечном итоге он сводится к вызову DeleteUnmanagedObject
5) Анализируем DeleteUnmanagedObject:
protected unsafe override void DeleteUnmanagedObject()
{
AcDbObject* impObj = this.GetImpObj();
AcDbObjectId acDbObjectId;
if (((*<Module>.AcDbObject.objectId(impObj, &acDbObjectId) == 0L) ? 1 : 0) != 0)
{
if (impObj != null)
{
object arg_24_0 = calli(System.Void* modopt(System.Runtime.CompilerServices.CallConvCdecl)(System.IntPtr,System.UInt32), impObj, 1, *(*(long*)impObj));
}
}
else
{
int num = (int)<Module>.AcDbObject.close(this.GetImpObj());
if (num != 0)
{
throw new Exception((ErrorStatus)num);
}
}
}
6) Убеждаемся, что если у объекта свойство ObjectId равно null, то идет освобождение памяти для неуправляемого объекта, вокруг которого наш объект лишь обертка, а если отлично от null, то вызывается метод Close этого же неуправляемого объекта.
Далее делаем выводы что в коде автора в случае нормального выполнения Close будет вызван дважды, что как раз и может приводить к краху AutoCAD.
Первый Close будет вызван при выходе из блока using (RegAppTableRecord regAppRecord = new RegAppTableRecord()) {}
Второй Close будет вызван при вызове tr.Commit();