тестировать лучше по шагам. Александр дал уже готовый код, но тогда ошибку возможно не увидим. А хотелось бы.
1. Убери лишние строки в RunWblockCloneObjects:
Document doc = Application.DocumentManager.MdiActiveDocument;
Database db = doc.Database;
Editor ed = doc.Editor;
Там нет работы с БД или документом
2. Попробуй убрать строки:
HostApplicationServices.WorkingDatabase = SourceDb;
HostApplicationServices.WorkingDatabase = ActiveDb;
Для цели вставки блоков, переключать не нужно.
3. Замени(Как у Александра)
BlockTableRecord btr = (BlockTableRecord)acTrans.GetObject(bt(BlkName), OpenMode.ForRead);
RequestedBlockIds.Add(btr.ObjectId);
на
RequestedBlockIds.Add(bt(BlkName))
4. Попробуй добавить Dispose(), после того, как закончил использовать:
ObjectIdCollection RequestedBlockIds
IdMapping mapping
5. Возможно крашит частое переключение блокировки листа DocumentLock doclock = doc.LockDocument()
Вынеси его в RunWblockCloneObjects()
6. Попробуй вставить в блок try-Catch:
ActiveDb.WblockCloneObjects(RequestedBlockIds, ActiveDb.BlockTableId, mapping, DuplicateRecordCloning.Ignore, false);
...у меня такое было, когда пытался клонировать прокси
И нужно вывести в строку имя блока, на каком блоке не выполнился WblockCloneObjects
Если все проделаешь по шагам, и найдешь ошибку, то будет просто замечательно)))