DirectCast(SourceDb.BlockTableId.Open(OpenMode.ForRead), BlockTable)
Александр метод Open помечается как устаревший (For advanced use only. Use GetObject instead). Это не приведет к каким-нибудь сюрпризам?
Нет. Никаких сюрпризов не будет. И будет работать быстрее. Но его очень желательно использовать в блоке Using, а если нет, то не забывать принудительно вызывать его метод Close. Иначе развалишь AutoCAD. Не зря написано:
For advanced use only5. Предложение Дмитрия №4. Добавил mapping.Dispose после WblockCloneObjects. Пока вылечило. Ошибка не воспроизводится. На AutoCal MEP 2012 х64 под Win8 и на Autocad MEP 2011 х64 под Win7 64.
Похоже на элементарную утечку памяти. Но у меня она не воспроизвелась - возможно памяти было достаточно, возможно причина в том, что у меня чистый AutoCAD, а не MEP. Может быть если зациклить твой код для вставки тысячи блоков это бы воспроизвелось. В действительности при WblockCloneObjects mapping заполняется часто достаточно большим количеством ObjectId объектов (в твоём случае это как минимум ObjectId всех элементы блоков, слоёв, типов линий, динамическими вещами и т.д.). Ну и если это делается многократно, то утечка будет. Короче говоря
Привалов Дмитрий абсолютно прав, что всё, что создал нужно чистить после того как ни ты ни AutoCAD это уже не использует. Можно было при помощи блока Using.
2. Попробуй убрать строки:
HostApplicationServices.WorkingDatabase = SourceDb;
HostApplicationServices.WorkingDatabase = ActiveDb;
Для цели вставки блоков, переключать не нужно.
Хотел уточнить в каком случае тогда нужно переключать? Я предполагал если код работает с такой-то базой, то я делаю ее текущей, конечно в случае если идет работа с несколькими базами.
Переключать нужно тогда, когда AutoCAD сам не знает откуда ему брать ссылки на объекты. Например, для примитива DBText где взять ObjectId для текстового стиля по-умолчанию, или ObjectId для слоя. По поводу:
SelectCrossingPolygon
это отношения к делу не имеет, т.к. тут важно не WorkingDatabase, а ActiveDocument.