Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: Борис_С от 25-02-2021, 19:34:13

Название: Почему появилось исключение
Отправлено: Борис_С от 25-02-2021, 19:34:13
Загрузил документ:
Код - C# [Выбрать]
  1. Database acCurDb = new Database(false, true);
  2. strFileName = "c:\\Users\\sbe.CSOFT-SPB\\Documents\\AutoCAD\\Чертеж.dwg";
  3. acCurDb.ReadDwgFile(strFileName, FileShare.Read, true, null);
  4.  
Вызвал метод поиска текстов чертежа: FindTextsInDrawing(acCurDb);
На операторе using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction()) получил исключение
System.InvalidProgramException: 'Среда выполнения Common Language Runtime обнаружила недопустимую программу.'
Где я не прав?


Название: Re: Почему появилось исключение
Отправлено: Александр Ривилис от 25-02-2021, 19:53:08
Борис_С,
По этому обрывку кода я ничего сказать не могу.
Название: Re: Почему появилось исключение
Отправлено: Борис_С от 25-02-2021, 20:11:53
Немного изменил код. Загружаю чертеж при старте accoreconsole.exe.
Код - C# [Выбрать]
  1. using acadConsApp = Autodesk.AutoCAD.ApplicationServices.Core.Application;
  2.  
  3. namespace ConsoleApp
  4. {
  5.     class AcadBatchProcessing
  6.     {
  7.         static void Main(string[] args)
  8.         {
  9.             string strFileName = "c:\\Users\\sbe.CSOFT-SPB\\Documents\\AutoCAD\\Чертеж.dwg";
  10.             System.Diagnostics.Process.Start("C:\\Program Files\\Autodesk\\AutoCAD 2020\\accoreconsole.exe",
  11.                 "/i " + strFileName);
  12.             FindTextsInDrawing();
  13.         }
  14.  
  15.         // Поиск всех текстов чертежа
  16.         public static void FindTextsInDrawing()
  17.         {
  18.             try
  19.             {
  20.                 // Get the current document and database, and start a transaction
  21.                 Document acDoc = acadConsApp.DocumentManager.MdiActiveDocument;
  22.                 Database acCurDb = acDoc.Database;
  23.  
  24.                 using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
  25.                 {
  26.                     // Открываю Block table для чтения
  27.                     BlockTable acBlkTbl;
  28.                     acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId,
  29.                                                  OpenMode.ForRead) as BlockTable;
  30.  
  31.                     // Открываю Block table record Model space для чтения
  32.                     BlockTableRecord acBlkTblRec;
  33.                     acBlkTblRec = acTrans.GetObject(acBlkTbl[BlockTableRecord.ModelSpace],
  34.                                                     OpenMode.ForRead) as BlockTableRecord;
  35.                     FindItems(acTrans, acBlkTblRec);
  36.                 }
  37.             }
  38.             catch (System.Exception e)
  39.             {
  40.                 var acDocEd = acadConsApp.DocumentManager.MdiActiveDocument.Editor;
  41.                 acDocEd.WriteMessage(String.Format("Ошибка. {0}{1}" + Environment.NewLine, e.Message, e.StackTrace));
  42.             }
  43.         }
  44.     }
  45. }
  46.  

На операторе Document acDoc = acadConsApp.DocumentManager.MdiActiveDocument; возникает то же исключение:
System.InvalidProgramException: 'Среда выполнения Common Language Runtime обнаружила недопустимую программу.'
Название: Re: Почему появилось исключение
Отправлено: Александр Ривилис от 25-02-2021, 20:21:21
Борис_С,
Извини, но это бред. Нужно запустить accoreconsole.exe с scr-файлом, которые загружает .NET-сборку (твоё приложение) и запускает команду для обработки чертежей. Ты же сейчас пытаешься выполнить код работы с чертежом из своего exe-файла, что сделать не получится...
Название: Re: Почему появилось исключение
Отправлено: Борис_С от 25-02-2021, 20:26:00
А где про это можно прочитать или посмотреть примеры?
Название: Re: Почему появилось исключение
Отправлено: Александр Ривилис от 25-02-2021, 20:28:39
А где про это можно прочитать или посмотреть примеры?
https://adndevblog.typepad.com/autocad/2012/04/getting-started-with-accoreconsole.html
Там есть архив с видео и примерами: https://adndevblog.typepad.com/autocad/Downloads/DevTV-AccoreConsole.zip
Название: Re: Почему появилось исключение
Отправлено: Борис_С от 25-02-2021, 20:32:32
Большое спасибо. Что бы мы без тебя делали.
Название: Re: Почему появилось исключение
Отправлено: Борис_С от 26-02-2021, 19:25:45
Попробовал собрать библиотеку из архива и запустить ее.
Получил сообщение.
Команда: (command "_.Netload" "C:\\Temp\\AccoreConsoleDemoSource\\Demo\\bin\\Debug\\NetTest1.dll")
_.Netload Имя файла сборки: C:\Temp\AccoreConsoleDemoSource\Demo\bin\Debug\NetTest1.dll Не удалось загрузить сборку C:\Temp\AccoreConsoleDemoSource\Demo\bin\Debug\NetTest1.dll
Что это может означать? Сама сборка собралась без ошибок и сидит по указанному адресу.
Название: Re: Почему появилось исключение
Отправлено: Александр Ривилис от 26-02-2021, 19:31:01
Борис_С,
Надеюсь, что acmgd.dll не используется. Если используется - убери. Ну и на всякий случай:
1) замени обратный слэш на прямой.
2) перед вызовом NETLOAD установи SECURELOAD (https://knowledge.autodesk.com/ru/support/autocad/learn-explore/caas/CloudHelp/cloudhelp/2019/RUS/AutoCAD-Core/files/GUID-541566C6-2738-49DD-87C3-C1490E924A02-htm.html) в 0:
(setvar "SECURELOAD" 0)
Название: Re: Почему появилось исключение
Отправлено: Борис_С от 26-02-2021, 22:03:04
Спасибо. Помогло.
И еще один вопрос. Как осуществлять отладку программы? Можно ли как-то устанавливать точки останова в dll?
Название: Re: Почему появилось исключение
Отправлено: Александр Ривилис от 26-02-2021, 22:10:26
Как осуществлять отладку программы? Можно ли как-то устанавливать точки останова в dll?
Вообще-то так же, как и для AutoCAD.
Название: Re: Почему появилось исключение
Отправлено: Борис_С от 27-02-2021, 21:30:53
Загрузил dll из скрипта bat-файла. Проект в это время был загружен в Microsoft Visual Studio, установлены точки останова.
В точки останова не попадаю, хотя dll выполняется (вижу по отладочной печати).
Название: Re: Почему появилось исключение
Отправлено: Александр Ривилис от 27-02-2021, 21:36:00
Загрузил dll из скрипта bat-файла. Проект в это время был загружен в Microsoft Visual Studio, установлены точки останова.
В точки останова не попадаю, хотя dll выполняется (вижу по отладочной печати).
Видимо не грузится pdb-файл этого dll-файла.
Название: Re: Почему появилось исключение
Отправлено: Александр Ривилис от 27-02-2021, 21:41:03
А что у тебя здесь:

(https://live.staticflickr.com/65535/50986337256_cf934a8a0c_o.png)
Название: Re: Почему появилось исключение
Отправлено: Борис_С от 27-02-2021, 22:06:19
Исправил, но все равно в точку останова не попадаю.
Может быть вместо acad.exe нужно написать accoreconsole.exe?
Название: Re: Почему появилось исключение
Отправлено: Александр Ривилис от 27-02-2021, 22:24:25
Может быть вместо acad.exe нужно написать accoreconsole.exe?
Конечно. И с правильными параметрами (которые ты в bat-файл внес). И запускать из Visual Studio через F5 (Debug->Start Debugging). Иначе как Visual Studio поймёт что ты собираешься отлаживать?
Название: Re: Почему появилось исключение
Отправлено: Борис_С от 27-02-2021, 22:35:33
Спасибо. Да, теперь попадаю в точки останова, но почему-то в консоль не выводится отладочная печать.
Название: Re: Почему появилось исключение
Отправлено: Александр Ривилис от 27-02-2021, 22:50:42
но почему-то в консоль не выводится отладочная печать.
А как ты печатаешь?
Название: Re: Почему появилось исключение
Отправлено: Борис_С от 28-02-2021, 11:04:34
Код - C# [Выбрать]
  1. using acadConsApp = Autodesk.AutoCAD.ApplicationServices.Core.Application;
  2. var acDocEd = acadConsApp.DocumentManager.MdiActiveDocument.Editor;
  3. acDocEd.WriteMessage(String.Format("Печать"));
  4.  
Если запускаю из bat-файла, все печатается.
Если из-под Visual Studio - не печатается.
Название: Re: Почему появилось исключение
Отправлено: Александр Ривилис от 28-02-2021, 15:33:02
Борис_С,
А если:
Код - C# [Выбрать]
  1. acDocEd.WriteMessage(String.Format("\nПечать\n"));
Название: Re: Почему появилось исключение
Отправлено: Борис_С от 28-02-2021, 15:47:22
Спасибо. В этом случае печатается.
Название: Re: Почему появилось исключение
Отправлено: Борис_С от 01-03-2021, 13:07:50
А можно с accoreconsole.exe работать как с com-объектом?
Название: Re: Почему появилось исключение
Отправлено: Александр Ривилис от 01-03-2021, 14:45:57
А можно с accoreconsole.exe работать как с com-объектом?
Нет. Это уже на форуме обсуждалось.