Autodesk.Windows.RibbonItem FindNearestRibbonItem(System.Windows.DependencyObject)А вы уверены, что ошибка-то в окне? Пробовали заменить тестовую функцию на, например, функцию "отрезок"?:
Чет я сразу не заметил - если из окна вызывать SendStringToExecute, то вариант свернуть/развернуть не прокатит. Только закрывать окно совсем. А иначе там должна быть именно ваша функция вызываемая как обычный метод. Думаю конечно можно использовать события начала и окончания функции, но это заморочки
Желательно, чтобы только код с этой проблемой ;)Не желательно, а обязательно. Т.е. сделать отдельный тестовый пример для проверки.
Значение acDoc проверял? Оно не null?
Не желательно, а обязательно. Т.е. сделать отдельный тестовый пример для проверки.
Проверял, не null.Попробуй запускать через ((AcadDocument)acDoc.AcadDocument).SendCommand("t105\n");
((AcadDocument)acDoc.AcadDocument).SendCommand("t105\n");
Выложенный проект сработал в обоих случая одинаково - без ошибок...
НО! Я так и не понял - под какой какую версию автокада пишется проект? Я пробовал на 2010
Просто в ссылках я увидел System.Xaml, но при этом у проекта в настройках стоял .Net framework 3.5 (которому эта ссылка не нужна...)
Гм, странно, у меня воспроизводится. Делался он для 2011 версии. Если уж совсем точно, то для 2011 версии архитектурного автокада. А ссылка осталась, когда забыл версию компилятора поменять, создавая проект в 2015 вижлеТак зачем тогда Net framework 3.5??? Поставьте 4.0 и проверьте
Так зачем тогда Net framework 3.5??? Поставьте 4.0 и проверьте
Ну у меня 3.5 стоит, проблему то это не убирает, верно?Твой пример с .NET 3.5 у меня вообще отказался компилироваться из-за System.Xaml, которого в 3.5 нет
Убрал лишнее и проверил под .NET 3.5 с AutoCAD 2011 - никаких ошибок.
talso, во-первых - проверь через пошаговую отладку
во-вторых - лучше пиши конкретно какую Exception ловишь (я пишу обычно System.Exception)
в-третьих - судя по скрину проблема таки не с автокадом связана
Возможно дело в AutoCAD Architecture, возможно в VS 2015 (менее вероятно) - я использовал VS 2010.
Начни с того, что убедись, что у тебя установлены все обновления на AA: https://knowledge.autodesk.com/support/autocad-architecture/downloads?release=2011
Приведите пожалуйста настройки acad.exe.config.AutoCAD 2011 (нетронутый вариант config-файла)
P.S.: Кстати, а как насчет установки CopyLocal в False и использование dll-файлов из каталога inc в составе ObjectARX SDK 2011 ?
А библиотеки все из ObjectArx.Да ну? А это что тогда:
Да ну? А это что тогда:
Код - XML: [Выделить]
<Reference Include="acdbmgd">
<HintPath>..\..\..\..\..\..\..\Program Files\Autodesk\AutoCAD Architecture 2011\acdbmgd.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="acmgd">
<HintPath>..\..\..\..\..\..\..\Program Files\Autodesk\AutoCAD Architecture 2011\acmgd.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="AdWindows">
<HintPath>..\..\..\..\..\..\..\Program Files\Autodesk\AutoCAD Architecture 2011\AdWindows.dll</HintPath>
<Private>False</Private>
</Reference>
В конце концов команда, как я понял, у тебя запускается в любом случае. Так в чем проблема?
Во-вторых - тормозит, когда Exception ловит,заметно причемВ этом месте никаких тормозов быть не должно. В крайнем случае несколько миллисекунд / несколько десятков миллисекунд. И это же не то место, которое работает в длительном цикле, а только по нажатию на гиперссылку.
В-третьих, не нравится мне AutoCad подход - try/catch где ни попадя навешивать (как у них это например с методом Initialize сделано, и еще в паре мест).Это ты о чем???
И все-же я повторю свой вопрос риторический - почему ошибка происходит в AcWindows.dll?Я догадываюсь почему. Там есть командный реактор, который похоже и срабатывает на запуск команды и вызывает исключение. Командный реактор здесь особенный, который должен срабатывать на события в Ленте (Ribbon), но срабатывает похоже и на события в WPF. Почему не знаю. И честно говоря не интересно, т.к. у меня эта ошибка не воспроизводится, интернет о ней не знает и версия AutoCAD Architecture 2011 уже давно не поддерживается.
Это ты о чем???
И все-же я повторю свой вопрос риторический - почему ошибка происходит в AcWindows.dll?
Либо автор что-то нам не договаривает либо я даже не знаю...
Это я о том, что проглатываются исключения в методе Initialize. У них видимо все вызовы этих методов в блоки try/catch заключены. К примеру, если написать вот такой дурацикй код :AutoCAD загрузится или dll-сборка? Если в методе Initialize возникает исключение, то команды определённые в сборке не определяются. Так что если у тебя нетривиальный Initialize, то try/catch в нём лучше ставить самому.
Код - C#: [Выделить]
public void Initialize()
{
Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage("Init done\n");
List<int> m = null;
var d = m[25];
}
То автокад загрузится и не вылетит.
AutoCAD загрузится или dll-сборка? Если в методе Initialize возникает исключение, то команды определённые в сборке не определяются. Так что если у тебя нетривиальный Initialize, то try/catch в нём лучше ставить самому.
Автокад загрузится, и при это ничего мне скажет .Прочитай что ты написал.
Прочитай что ты написал.
А я привык блоки try/catch вешать только там, где пользователь может сгенерировать исключительную ситуацию, а не я сам.Реактор, это такая хитрая штука, что отсутствие обработчика в большинстве случаев приводит не просто к исключению, а к аварийному завершению AutoCAD.
Реактор, это такая хитрая штука, что отсутствие обработчика в большинстве случаев приводит не просто к исключению, а к аварийному завершению AutoCAD.
Причем если в catch еще и что-то делать (например выводить сообщение и что-то у пользователя спрашивать), то это будет еще хуже, так как реактор может выполнится повторно. Поэтому они поставили свои try/catch с пустым catch.
Впрочем, это всё пустой разговор. Нужно знать как это работает в AutoCAD и под это подстраиваться. Другого поведения не будет, так как это не баг, а специфическое поведение.