Тема: Работа с несколькими файлами
Есть необходимость в программе, которая бы открывала dwg файлы, производила с ними определенные операции (извлечение информации о содержимом, очистка, сохранение под другим именем и т.п.). Начитавшись сайтов и форумов, сваял вот такое:
[CommandMethod("Test1")] public void Test1() { DirectoryInfo rootDir = new DirectoryInfo(@"d:\dwg"); System.IO.FileInfo[] files = null; files = rootDir.GetFiles("*.dwg"); foreach (System.IO.FileInfo file in files) { Document activeDoc = acad.DocumentManager.MdiActiveDocument; Document dwgFile = acad.DocumentManager.Open(file.FullName); if (acad.DocumentManager.MdiActiveDocument != dwgFile) { acad.DocumentManager.MdiActiveDocument = dwgFile; } Database dwgDB = acad.DocumentManager.MdiActiveDocument.Database; //Здесь будут какие-нибудь манипуляции с базой dwgFile.CloseAndDiscard(); if (acad.DocumentManager.MdiActiveDocument != activeDoc) { acad.DocumentManager.MdiActiveDocument = activeDoc; } } }
При отладке, когда программа доходит до строки
Document dwgFile = acad.DocumentManager.Open(file.FullName);
получаю ошибку:
LoaderLock was detected
Message: Попытка выполнения управляемого кода под блокировкой OS Loader. Запуск управляемого кода в пределах функции DllMain или функции инициализации образа может вызвать зависание приложения.
LoaderLock, конечно, можно отключить в Visual Studio, но при отладке тогда получаю сообщение:
mt.dll
A debugger has been found running in your system. Please, unload it from memory and restart your program
,
а при загрузке dll без отладки, открывается первый файл, а потом каждый раз вручную приходится активировать файл, который был открыт до запуска команды, чтобы программа продолжала работать.
Пробовал другой способ доступа к базе чертежей. Что-то типа этого:
foreach (System.IO.FileInfo file in files) { Database db = new Database(false, true); HostApplicationServices.WorkingDatabase = db; db.ReadDwgFile(file.FullName, FileOpenMode.OpenForReadAndAllShare, false, null); }
В строке
db.ReadDwgFile(file.FullName, FileOpenMode.OpenForReadAndAllShare, false, null);
опять получаю ошибку "LoaderLock was detected". Что я делаю неправильно? Это как-то связано с блокированием документов? Конструкции типа
using (doc.LockDocument())
в моей программе нужны? Тестирую с Autocad 2014, если это имеет значение.