我使用句柄2D44对多段线运行了GetHandle()方法,代码如下:
- public static void TestCrash()
- {
- var dwg = Application.DocumentManager.MdiActiveDocument;
- var ed = dwg.Editor;
- var res = ed.SelectAll(
- new SelectionFilter(
- new Autodesk.AutoCAD.DatabaseServices.TypedValue[]
- {
- new Autodesk.AutoCAD.DatabaseServices.TypedValue((int)DxfCode.LayoutName, "MODEL")
- }));
- if (res.Status== PromptStatus.OK)
- {
- foreach (ObjectId id in res.Value.GetObjectIds())
- {
- if (id.Handle.ToString().ToUpper()=="2D44")
- {
- var h = GetHandle(id); //This is your code
- }
- }
- }
- }
我没有崩溃。既然你说它是间歇性的,我想你还没有找到一个一致的方法来复制它。然而,我在这里确实有几个问题:
1.GetHandle(ObjectId)方法的用途是什么?也许这里只是为了测试,以证明在提交事务时,组中多段线的特定ObjectId是崩溃的根源?因为该方法本身没有任何商业意义:如果您在memry中有一个ObjectId,那么您已经知道了它的句柄。所以,我认为你只是为了证明崩溃而编造出来的,并没有在任何实际工作中真正使用它。但我还是问了。
2.当我看到像GetHandle()这样的代码,其中ObjectId作为参数传递,但在方法内部(对于外部调用方来说,它应该是一个黑盒),代码仍然为操作数据库拾取MdiActiveDocument时,我感到非常不舒服:ObjectId已经提供了一个到ObjectId有效的数据库的路径,为什么需要将该方法绑定到MdiActiveDocument的数据库?这将有效地限制此方法只能与MdiActiveDocument一起使用,而不能用于任何打开的数据库,例如您编写代码运行的辅助数据库。也就是说,您可以使该方法在MdiActiveDocument或side数据库中有用,如果您这样做:<br>公共静态void对实体(ObjectId entId)<br><<br>使用(var-tran=entId.<strong>数据库</strong>TransactionManager.StartTransaction()〕<br>,<<br>tran.Commit();<br<trans><br>这也让我好奇:您可能是,在数据库处理端调用GetHandle()方法时,是否有可能获得错误
|