doctorraz Posted October 4, 2022 Report Share Posted October 4, 2022 (edited) При пакетной обработке чертежей (открыли файл, чето сделали закрыли) если было обращение к расширенным настройкам печати nanoCAD.InanoCADPlotCustomParams customPlotSettings = plot.CustomPlotSettings[activeLayout]; и обрабатываемые файлы программно закрывались, то при выходе из командного метода (именно на последней скобке закрывающего метода) нана22 молча валится В Нана 20 все хорошо Спойлер using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.IO; #if NC using App = HostMgd.ApplicationServices; using Cad = HostMgd.ApplicationServices.Application; using Db = Teigha.DatabaseServices; using Gem = Teigha.Geometry; using Ed = HostMgd.EditorInput; using Rtm = Teigha.Runtime; #else using App = Autodesk.AutoCAD.ApplicationServices; using Cad = Autodesk.AutoCAD.ApplicationServices.Application; using Db = Autodesk.AutoCAD.DatabaseServices; using Gem = Autodesk.AutoCAD.Geometry; using Ed = Autodesk.AutoCAD.EditorInput; using Rtm = Autodesk.AutoCAD.Runtime; #endif namespace PubCrach { public class Command : Rtm.IExtensionApplication { [Rtm.CommandMethod("Crashs", Rtm.CommandFlags.Session)] public void CrashS() { Crash(); } [Rtm.CommandMethod("Crash")] public void Crash() { Ed.Editor ed = App.Application.DocumentManager.MdiActiveDocument.Editor; //сюда вернемся App.Document activeDoc = Cad.DocumentManager.MdiActiveDocument; //с ним работаем App.Document docWork; string sFile = @"c:\Temp\test.dwg"; for (int i = 1; i < 5; i++) { //откроем docWork = Cad.DocumentManager.Open(sFile, true); ed.WriteMessage("\nОткрыли {0}", i); //типа печать #region CustomPlotSettings HostMgd.ApplicationServices.Document doc = HostMgd.ApplicationServices.Application.DocumentManager.MdiActiveDocument; nanoCAD.Document comDoc = doc.AcadDocument as nanoCAD.Document; Teigha.DatabaseServices.Database db = doc.Database; //HostMgd.EditorInput.Editor ed = doc.Editor; // Получение ссылки на активный лист документа OdaX.IAcadLayout activeLayout = comDoc.ActiveLayout; // Получение ссылки на свойство Plot активного документа nanoCAD.Plot plot = (nanoCAD.Plot)comDoc.Plot; // Получение ссылки на расширенные настройки печати активного документа //!!!!!ЕСЛИ ЗАКОМММЕНТИРОВАТЬ ЭТУ СТРОЧКУ ТО ВЫЛЕТОВ НЕ БУДЕТ nanoCAD.InanoCADPlotCustomParams customPlotSettings = plot.CustomPlotSettings[activeLayout]; #endregion ed.WriteMessage("\nПечатаем {0}", i); //закрываем //!!ЕСЛИ НЕ ЗАКРЫВАТЬ ТО НЕ ВЫЛЕТАЕТ docWork.CloseAndDiscard(); ed.WriteMessage("\nЗакрыли {0}", i); } ed.WriteMessage("\nПри выходе НАНА22 упадет"); } public void Initialize() { //throw new NotImplementedException(); } public void Terminate() { //throw new NotImplementedException(); } } } не зависимо лочим мы документ или нет, команда в контексте документа или приложения... нана22 упадет, если не закрывать документы, не упадет... ----------- у кого есть возможность посмотрите пожалуйста.. надеюсь, что косячу я.. если баг это навечно Спойлер PubCrachPrj.zip Edited December 2, 2022 by doctorraz удалил DLL, там неверный путь, сразу валиться будет 2 Quote Link to comment Share on other sites More sharing options...
doctorraz Posted October 5, 2022 Author Report Share Posted October 5, 2022 самый прикол, что такаяжэж шляпа из эксель работает без проблем Sub Notcrach() sFile = "c:\Temp\test.dwg" Set objNanoCAD = GetObject(, "nanoCAD.Application") For i = 1 To 10 Set comdoc = objNanoCAD.Documents.Open(sFile) Set al = comdoc.ActiveLayout Set Plot = comdoc.Plot Set cps = Plot.CustomPlotSettings(al) comdoc.Close Next End Sub ------------- Quote Link to comment Share on other sites More sharing options...
Светлана Мирончик Posted October 5, 2022 Report Share Posted October 5, 2022 (edited) Проверьте, чтобы к проекту VS была подключена правильная версия nanocad Type Library. У меня и CustomPlotSettings и CloseAndDiscard срабатывают как надо в 22й Edited October 5, 2022 by Светлана Мирончик Quote Link to comment Share on other sites More sharing options...
doctorraz Posted October 5, 2022 Author Report Share Posted October 5, 2022 (edited) 31 минуту назад, Светлана Мирончик сказал: правильная версия nanocad Type Library с чужой версией сразу эксепшен... ---------------- ну и если писать под нано20-22 то dynamic все жэж работает с поздним связыванием и ничего не крашится если не закрывать документы нана20 на этом жэ коде при закрытии не падает более того прекрасно работает с либами от NC_SDK_22.0.5944.3726.6053 31 минуту назад, Светлана Мирончик сказал: срабатывают как надо в 22й 22й нано это который зарелизен или в разработке? а попробуй for (int i = 1; i < 20; i++) --------- на нескольких машинах проверил падает или виснет 6069 и 6122 Edited October 5, 2022 by doctorraz 1 Quote Link to comment Share on other sites More sharing options...
doctorraz Posted October 5, 2022 Author Report Share Posted October 5, 2022 Еще грустный нюансец Дома не установлен нано20 соответственно подключить Interop.nanoCAD.dll и Interop.OdaX.dll не получится((( c:\NCP_SDK_20.1.5304.3354.5404\include-x64\ncauto.tlb пустышка еще при сборке ошибки 1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin\Microsoft.Common.CurrentVersion.targets(2827,5): warning MSB3305: обработка ссылки COM "OdaX" из пути "C:\Program Files\Nanosoft\nanoCAD x64 22.0\bin\OdaX_csd.dll". Программе импорта библиотек типов не удалось преобразовать сигнатуру для члена "tagCALPOLESTR.pElems". 1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin\Microsoft.Common.CurrentVersion.targets(2827,5): warning MSB3305: обработка ссылки COM "OdaX" из пути "C:\Program Files\Nanosoft\nanoCAD x64 22.0\bin\OdaX_csd.dll". Программе импорта библиотек типов не удалось преобразовать сигнатуру для члена "tagCADWORD.pElems". =================================== но собирается и работает, с учетом вышенаписанного добавлено через 7 минут открыл отладку нано в студии пишет такую ошибку ------ Необработанное исключение по адресу 0x00007FFE109CE00E (ucrtbase.dll) в nCadS.exe: Запрашивается выход из программы в результате неустранимой ошибки. ------------ Quote Link to comment Share on other sites More sharing options...
Светлана Мирончик Posted October 5, 2022 Report Share Posted October 5, 2022 (edited) 6 часов назад, doctorraz сказал: с чужой версией сразу эксепшен... ---------------- ну и если писать под нано20-22 то dynamic все жэж работает с поздним связыванием и ничего не крашится если не закрывать документы нана20 на этом жэ коде при закрытии не падает более того прекрасно работает с либами от NC_SDK_22.0.5944.3726.6053 22й нано это который зарелизен или в разработке? а попробуй for (int i = 1; i < 20; i++) for (int i = 1; i < 20; i++) --------- на нескольких машинах проверил падает или виснет 6069 и 6122 Да, после цикла падает nanoCAD. Попробуйте добавить внутри цикла Marshal.ReleaseComObject() для всех COM-объектов после их использования и docWork.Dispose() тоже в конце. У меня 22й nanoCAD перестал крашиться после этой доработки. Edited October 5, 2022 by Светлана Мирончик 1 1 Quote Link to comment Share on other sites More sharing options...
doctorraz Posted October 5, 2022 Author Report Share Posted October 5, 2022 Только что, Светлана Мирончик сказал: Marshal.ReleaseComObject() для всех COM-объектов Спасибо добавлю, попробую Но нано20 это ничего не требуется.. Есть шанс, что следующие нановерсии избавят от этого бага? Quote Link to comment Share on other sites More sharing options...
doctorraz Posted October 5, 2022 Author Report Share Posted October 5, 2022 1 час назад, Светлана Мирончик сказал: внутри цикла Marshal.ReleaseComObject() для всех COM-объектов таки да Спасибо БОЛЬШОЕ Спойлер [Rtm.CommandMethod("динамик", Rtm.CommandFlags.Session)] public void CrashDin() { //болтушка Ed.Editor ed = Cad.DocumentManager.MdiActiveDocument.Editor; //сюда вернемся App.Document activeDoc = Cad.DocumentManager.MdiActiveDocument; string sFile = @"c:\Temp\test.dwg"; for (int i = 1; i < 40; i++) { //откроем App.Document docWork = Cad.DocumentManager.Open(sFile, true); ed.WriteMessage("\nОткрыли {0}", i); //типа печать #region CustomPlotSettings dynamic comDoc = docWork.AcadDocument; // Получение ссылки на активный лист документа dynamic activeLayout = comDoc.ActiveLayout; // Получение ссылки на свойство Plot активного документа dynamic plot = comDoc.Plot; // Получение ссылки на расширенные настройки печати активного документа dynamic customPlotSettings = plot.CustomPlotSettings[activeLayout]; #endregion ed.WriteMessage("\nПечатаем {0}", i); //уменьшаем ссылки rcW Marshal.ReleaseComObject(comDoc); Marshal.ReleaseComObject(activeLayout); Marshal.ReleaseComObject(plot); Marshal.ReleaseComObject(customPlotSettings); docWork.CloseAndDiscard(); //docWork.Dispose(); ed.WriteMessage("\nЗакрыли {0}", i); } //!!ТЕПЕРЬ НЕ ВЫЛЕТАЕТ!!!! ed.WriteMessage("\nПри выходе НАНА22 НЕ упадет"); //возвращаем активный Cad.DocumentManager.MdiActiveDocument = activeDoc; App.Application.DocumentManager.DocumentActivationEnabled = true; } а то чуть руки не опустил добавлено через 9 минут в этом коде Dispose вроде как не влияет, но появилась идея для в 6122 немного поправили, но иногда ID пустой, рандом полнейший без Using ID всегда приходят, но утечка памяти, попробую ручками Dispose 2 Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.