关于《AutoCAD VBA和VB.NET开发基础和实例教程》C#版中Chop03章Netselection类库中TestGetSelect命令出错的问题

**TestGetSelect命令出错问题遇到的现象和发生背景 **

编译运行环境:win10,visual studio 2022,acad2016,.net framework 4.8;
win10,visual studio 2010sp1,acad2008sp1,.net framework 3.5.
问题:标题中的Netselection类库编译在上述两种环境中军正常编译通过,但在autocad中运行TestGetSelect命令弹出错误窗口。

**TestGetSelect命令出错问题相关代码,请勿粘贴截图 **

using System.Linq;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Runtime;
using DotNetARX;
namespace NetSelection
{
    public class NetSelection
    {
        [CommandMethod("TestGetSelect")]
        public static void TestGetSelect()
        {
            Document doc=Application.DocumentManager.MdiActiveDocument;
            Database db=doc.Database;
            Editor ed=doc.Editor;
            //生成三个同心圆并添加到当前模型空间
            Circle cir1=new Circle(Point3d.Origin, Vector3d.ZAxis, 10);
            Circle cir2=new Circle(Point3d.Origin, Vector3d.ZAxis, 20);
            Circle cir3=new Circle(Point3d.Origin, Vector3d.ZAxis, 30);
            db.AddToModelSpace(new Circle[] { cir1, cir2, cir3 });
            //提示用户选择对象
            PromptSelectionResult psr = ed.GetSelection();
            if (psr.Status != PromptStatus.OK) return;//如果未选择,则返回
            //获取选择集
            SelectionSet ss=psr.Value;
            //信息提示框,给出选择集中包含实体个数的提示
            Application.ShowAlertDialog("选择集中实体的数量:" + ss.Count.ToString());
        }
    }
}


using System;
using System.Text.RegularExpressions;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Runtime;
namespace DotNetARX
{
    /// <summary>
    /// 辅助操作类
    /// </summary>
    public static partial class Tools
    { 
        /// <summary>
        /// 将实体添加到模型空间
        /// </summary>
        /// <param name="db">数据库对象</param>
        /// <param name="ent">要添加的实体</param>
        /// <returns>返回添加到模型空间中的实体ObjectId</returns>
        public static ObjectId AddToModelSpace(this Database db, Entity ent)
        {
            ObjectId entId;//用于返回添加到模型空间中的实体ObjectId
            //定义一个指向当前数据库的事务处理,以添加直线
            using (Transaction trans=db.TransactionManager.StartTransaction())
            {
                //以读方式打开块表
                BlockTable bt=(BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForRead);
                //以写方式打开模型空间块表记录.
                BlockTableRecord btr=(BlockTableRecord)trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
                entId = btr.AppendEntity(ent);//将图形对象的信息添加到块表记录中
                trans.AddNewlyCreatedDBObject(ent, true);//把对象添加到事务处理中
                trans.Commit();//提交事务处理
            }
            return entId; //返回实体的ObjectId
        }

        /// <summary>
        /// 将实体添加到模型空间
        /// </summary>
        /// <param name="db">数据库对象</param>
        /// <param name="ents">要添加的多个实体</param>
        /// <returns>返回添加到模型空间中的实体ObjectId集合</returns>
        public static ObjectIdCollection AddToModelSpace(this Database db, params Entity[] ents)
        {
            ObjectIdCollection ids=new ObjectIdCollection();
            var trans=db.TransactionManager;
            BlockTableRecord btr=(BlockTableRecord)trans.GetObject(SymbolUtilityServices.GetBlockModelSpaceId(db), OpenMode.ForWrite);
            foreach (var ent in ents)
            {
                ids.Add(btr.AppendEntity(ent));
                trans.AddNewlyCreatedDBObject(ent, true);
            }
            btr.DowngradeOpen();
            return ids;
        }
      
  }

**TestGetSelect命令运行结果及报错内容 **

img

Autodesk.AutoCAD.Runtime.Exception: eNoActiveTransactions
在 Autodesk.AutoCAD.DatabaseServices.TransactionManager.GetObjectInternal(AcDbTransactionManager* pTM, ObjectId id, OpenMode mode, Boolean openErased, Boolean forceOpenOnLockedLayer)
在 Autodesk.AutoCAD.DatabaseServices.TransactionManager.GetObject(ObjectId id, OpenMode mode)
在 DotNetARX.Tools.AddToModelSpace(Database db, Entity[] ents)
在 NetSelection.NetSelection.TestGetSelect() 位置 G:\visuallisp练习\20220305\Chap03(vs2022)\NetSelection\NetSelection.cs:行号 22
在 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()

**我的解答思路和尝试过的方法 **

启用VS调试模式,发现问题在


db.AddToModelSpace(new Circle[] { cir1, cir2, cir3 });

这一行
进一步执行AddToModelSpace,问题提示在该方法的第二个重载方法的

 BlockTableRecord btr=(BlockTableRecord)trans.GetObject(SymbolUtilityServices.GetBlockModelSpaceId(db), OpenMode.ForWrite);

这一行

img

我想要达到的结果:
能够按教材作者的思路执行完该程序