各位大神,请教一个问题,我在用 WblockCloneObjects 从外部文件克隆块时,有非常大的概率出现致命错误。
出错位置“sourceDb.WblockCloneObjects(blockIds, destDb.BlockTableId, mapping, DuplicateRecordCloning.Replace, false);”
调试拦截到的错误信息如下:0x00007FFAFDE79649 (acdb23.dll)处(位于 acad.exe 中)引发的异常: 0xC0000005: 读取位置 0x0000000000000600 时发生访问冲突。
请问一下有什么解决办法吗?
完整代码如下:
public static void ImportBlocksFromDwg(this Database destDb, string sourceFileName)
{
//创建一个新的数据库对象,作为源数据库,以读入外部文件中的对象
Database sourceDb = new Database(false, true);
try
{
//把DWG文件读入到一个临时的数据库中
sourceDb.ReadDwgFile(sourceFileName, System.IO.FileShare.Read, true, null);
sourceDb.CloseInput(true);
//创建一个变量用来存储块的ObjectId列表
ObjectIdCollection blockIds = new ObjectIdCollection();
//获取源数据库的事务处理管理器, 在源数据库中开始事务处理
using (Transaction tm = sourceDb.TransactionManager.StartTransaction())
{
//打开源数据库中的块表
BlockTable bt = tm.GetObject(sourceDb.BlockTableId, OpenMode.ForRead, false) as BlockTable;
//遍历每个块
foreach (ObjectId btrId in bt)
{
BlockTableRecord btr = tm.GetObject(btrId, OpenMode.ForRead, false) as BlockTableRecord;
//只加入命名块和非布局块到复制列表中
if (!btr.IsAnonymous && !btr.IsLayout)
{
blockIds.Add(btrId);
}
btr.Dispose();
}
bt.Dispose();
}
//定义一个IdMapping对象
IdMapping mapping = new IdMapping();
//从源数据库向目标数据库复制块表记录
//sourceDb.WblockCloneObjects(blockIds, destDb.BlockTableId, mapping, DuplicateRecordCloning.Ignore, false);
sourceDb.WblockCloneObjects(blockIds, destDb.BlockTableId, mapping, DuplicateRecordCloning.Replace, false);
}
catch (Autodesk.AutoCAD.Runtime.Exception ex)
{
Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage("复制错误: " + ex.Message);
}
//操作完成,销毁源数据库
sourceDb.Dispose();
}