Сообщество программистов Autodesk в СНГ
Статьи => Опубликованные статьи => Тема начата: Александр Ривилис от 08-06-2013, 02:31:08
-
Точки останова в пользовательской форме не обрабатываются при отладке .NET – приложения для AutoCAD 2012 в Visual Studio 2010 (http://adn-cis.org/tochki-ostanova-v-polzovatelskoj-forme-ne-obrabatyivayutsya-pri-otladke.html)
-
Попробовал, помогает. Но перестала работать не лента, а подгрузка файла MNL для моего CUIX.
-
Странно. Что-то в командной строке пишет?
-
Ничего странного не пишет.
Немного больше информации:
AutoCAD Civil 3D 2014 x64. У меня сделан свой CUIX в котором дополнительная вкладка ленты. Рядом с этим CUIX находится одноименный файл MNL, в котором прописана загрузка моих DLL и FAS файлов. После того, как я отключил фиберы, загрузка этих файлов не происходит и мои команды не подгружаются в Civil. При этом, стандартные кнопки ленты работают без проблем. Если вручную через NETLOAD загрузить мои DLL, то мои команды начинают работать.
Также, при отключенных фиберах при каждом запуске Civil "слетает" системная переменная FILEDIA (становится = 0).
Если отключить фиберы, закрыть все чертежи и попробовать открыть любой чертеж (не завершая текущего сеанса), то Civil вылетает с фатальной ошибкой.
Может это такая особенность Civil 3D? Или особенность 2014 версии?
-
А что такое "фиберы"?
-
в котором прописана загрузка моих DLL и FAS файлов
DLL-файлы грузятся командой _NETLOAD?
Также, при отключенных фиберах при каждом запуске Civil "слетает" системная переменная FILEDIA (становится = 0).
А ты случайно в MNL-файле не сбрасываешь её в 0? Даже временно?
-
По-моему, если в AutoCAD "подсунуть" конструкцию типа
(command "_.netload" "<Полный путь к dll по правилам lisp>")
то менять filedia не понадобится. Мне так кажется...
-
Только вот я не уверен, что в этом контексте работает команда _NETLOAD (когда нет фиберов). Фибер (fiber) - это специально сформированная задача (thread). Microsoft в последние годы от этой технологии отказывается и при наличии фиберов плохо работает отладчик VS.
-
DLL-файлы грузятся командой _NETLOAD?
Да, верно.
А ты случайно в MNL-файле не сбрасываешь её в 0? Даже временно?
Вы провидец :) Да, ставлю в 0 перед NETLOAD'ами, возвращаю в исходное значение после.
Провел тест - поставил в начале лиспов вывод сообщения об их загрузке. Загрузка выполняется ровно до того момента, пока не доходит до первого вызова NETLOAD. Затем загрузка прерывается без всяких сообщений об ошибках. Код после вызова NETLOAD полностью игнорируется.
А вручную с помощью NETLOAD загружается без проблем.
-
1. "Обернуть" загрузку .NET-сборок в обработчик ошибок
2. Я написал в #6, что не надо обнулять filedia.
Пример:
(setq file "c:\\test\\test.dll")
(if (setq err (vl-catch-all-apply
(function
(lambda ()
(command "_.netload" file)
) ;_ end of lambda
) ;_ end of function
) ;_ end of vl-catch-all-apply
) ;_ end of setq
(princ (strcat "\nError loading .NET-assembly : " (vl-catch-all-error-p err)))
) ;_ end of if
-
Да, обработка FILEDIA лишняя, отключил. Спасибо!
Можно и обернуть, конечно. Но не уверен, что ошибка будет возникать. А даже если и будет, загружаться сборки все равно не станут, так что от этого не легче :(.
В общем, ошибку в форме отловил, включил обратно фиберы и все ок.
-
Я бы все же оставил "обертку". Мало ли...
-
Вы провидец
А ты не догадывался? :) DLL-файлы грузятся командой _NETLOAD?
Да, верно.
Это вторая проблема. Я бы сделал arx-файл специально для загрузки DLL-файлов, ну и других действий, которые средствами AutoCAD .NET API сделать сложно или даже невозможно:
Как загрузить из неуправляемого arx-приложения управляемую .NET сборку в AutoCAD? (http://adn-cis.org/kak-zagruzit-iz-neupravlyaemogo-arx-prilozheniya-upravlyaemuyu-.net-sborku-v-autocad.html)
-
Чтобы не запускать AutoCAD только для того, чтобы изменить значение NEXTFIBERWORLD, можно сделать это в реестре. Пример пути к ней:
HKEY_CURRENT_USER\Software\Autodesk\AutoCAD\R19.1\ACAD-D000:419\Profiles\<<C3D_Russia>>\General Configuration\NEXTFIBERWORLD
-
Чтобы не запускать AutoCAD только для того, чтобы изменить значение NEXTFIBERWORLD, можно сделать это в реестре.
AutoCAD много чего хранит в реестре, и NEXTFIBERWORLD в этом не исключение. Однако нужно помнить одну важную деталь: при завершении сеанса своей работы AutoCAD перезаписывает некоторые свои настройки в реестре, не зависимо от того, были ли они им изменены в ходе его работы или нет. Т.о. править настройки AutoCAD, хранящиеся в реестре, следует при выключенном AutoCAD, иначе твои изменения могут быть затёрты по завершению работы приложения. Попадает ли NEXTFIBERWORLD в категорию перезаписываемых переменных - я не проверял, но при желании это можно сделать и самостоятельно.
-
Ну, если автокад запущен - нет смысла лезть в реестр, можно и в нем поменять значение переменной :)
А вообще он не перезаписывает ее значение при завершении сеанса, я проверил.