Document.Editor.Command(...) и т.п. = eInvalidInput на AutoCAD 2016

Автор Тема: Document.Editor.Command(...) и т.п. = eInvalidInput на AutoCAD 2016  (Прочитано 21255 раз)

0 Пользователей и 3 Гостей просматривают эту тему.

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн A77X7Автор темы

  • ADN OPEN
  • Сообщений: 20
  • Карма: 0
Добрый день!
Суть проекта - выполнение исходного кода на C# в AutoCAD (динамическая компиляция и всё такое...).
Есть сборка на C# с классом от IExtensionApplication. Грузится в AutoCAD при его запуске (через реестр).
В ней в Initialize и DocumentManager_DocumentCreated подписываемся на нужные события. Здесь ничего особенного...
В итоге имеем обработчики событий типа
 
Код - C# [Выбрать]
  1. doc.CommandEnded += Doc_CommandEnded;

В таких обработчиках код типа:
Код - C# [Выбрать]
  1. compile_and_load_module(ctx);
В ctx всякие параметры для компиляции - пути к исходникам, пути к ссылкам, тип, запускаемый метод и т.п.
 
compile_and_load_module выполняет компиляцию исходников (CSharpCodeProvider.CompileAssemblyFromFile), сохраняет сборку на диске, загружает её в текущий AppDomain (т.е. в AutoCAD), ищет тип (из ctx) и выполняет метод (из ctx).
Скомпилированный метод делает какую-либо полезную работу, например вызывает другие команды AutoCAD...
Код - C# [Выбрать]
  1. var dm = Application.DocumentManager;
  2. var doc = dm.MdiActiveDocument;
  3. var ed = doc.Editor;
  4. ctx.acad_dwg.Editor.WriteMessage("Перед Editor.Command() 5 ...");
  5. await dm.ExecuteInCommandContextAsync(async (obj) =>
  6.   {
  7.     ed.WriteMessage("10000000000000000...");
  8.     ed.Command("_ATTSYNC", "_N", n);
  9.     ed.WriteMessage("20000000000000000...");
  10.   },
  11.   null
  12. );
Вызов команды я пытался сделать и как await ed.CommandAsync и через ExecuteInCommandContextAsync и без неё.
Читал http://through-the-interface.typepad.com/through_the_interface/2014/03/autocad-2015-calling-commands.html и http://through-the-interface.typepad.com/through_the_interface/2015/03/autocad-2016-calling-commands-from-autocad-events-using-net.html и много чего ещё.
Там написано, что так всё должно работать и работает, но у меня не работает. Возможно это из-за более длинной цепочки компиляции, загрузки, выполнения и т.п. Раньше это всё у меня работало через acedCmd...
Может кто-нибудь подскажет куда копать?..
« Последнее редактирование: 21-01-2016, 15:53:47 от A77X7 »

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
В чём соль сего действа?

Оффлайн A77X7Автор темы

  • ADN OPEN
  • Сообщений: 20
  • Карма: 0
Оперативное изменение поведения модуля (AutoCADа). Т.е. если исходник изменится, то он перекомпилируется и выполнится новая его версия.
(Исходник берётся из сети, централизовано)

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
1. Начни с того, что отформатируй код по правилам форума (смотри у меня в подписи).
2. Это касается только команды _ATTSYNC или каких-то еще?
3. Почему вместо ed.Command не воспользоваться Document.SendStringToExecute? Синхронности ты всё-равно не добьешься.
Вообще запуск команды из обработчика события - это "жуткая жуть".
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Оперативное изменение поведения модуля (AutoCADа). Т.е. если исходник изменится, то он перекомпилируется и выполнится новая его версия.
Ты уверен, что выполнилась именно новая версия? Я совершенно нет.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Т.е. если исходник изменится, то он перекомпилируется и выполнится новая его версия.
Напоминает игру в бадминтон в кукурузе. "Новая версия", говоришь... Но у тебя в рамках этой сессии в твой AppDomain уже загружена предыдущая версия твоей сборки. Это если бы в AutoCAD можно было бы использовать несколько AppDomain вместо одного общего - тогда да, а так то, что ты пытаешься прикрутить - достаточно сомнительная "конструкция" (имхо).

Оффлайн A77X7Автор темы

  • ADN OPEN
  • Сообщений: 20
  • Карма: 0
Да, я с начала сам сомневался, но по факту всё работает именно так. Выполняется последняя загруженная версия.
Это работает уже около 2-х лет как часы. И не только в среде AutoCAD.
Проблема не в этом...

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
A77X7
Повторюсь:
1. Начни с того, что отформатируй код по правилам форума (смотри у меня в подписи).
Ну и на остальные мои вопросы ты не ответил.
Выполняется последняя загруженная версия.
Многое зависит от простоты кода. Если в этом коде ты подписываешься на какие-то AutoCAD'овские события, то это верный путь к аварийному завершению AutoCAD.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн A77X7Автор темы

  • ADN OPEN
  • Сообщений: 20
  • Карма: 0
1. Начни с того, что отформатируй код по правилам форума (смотри у меня в подписи).
2. Это касается только команды _ATTSYNC или каких-то еще?
3. Почему вместо ed.Command не воспользоваться Document.SendStringToExecute? Синхронности ты всё-равно не добьешься.
Вообще запуск команды из обработчика события - это "жуткая жуть".
1.сейчас...
2.ну пробовал _REGENALL, например, и ещё какие-то свои и встроенные (для отладки), результат один: или eInvalidInput или тишина.
3.собственно синхронность то и нужна и вроде как пишут, что можно этого добиться. Document.SendStringToExecute... ну это только как запасной выход, и то может и не получится то, что задумано

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
3.собственно синхронность то и нужна и вроде как пишут, что можно этого добиться.
Очень сильно сомневаюсь. Для синхронности я бы организовал в коде команду (модальную), которую запускал бы из обработчика при помощи  Document.SendStringToExecute, а внутри этой команды попробовал запускать команды уже синхронно.

В любом случае если ты уперся в стену и без помощи Autodesk ты не можешь решить эту задачу, тебе придётся сделать минимальный тестовый проект, который я проверю и если не найду решения, то отправляю в ADN DevHelp.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн A77X7Автор темы

  • ADN OPEN
  • Сообщений: 20
  • Карма: 0
Многое зависит от простоты кода. Если в этом коде ты подписываешься на какие-то AutoCAD'овские события, то это верный путь к аварийному завершению AutoCAD.
События не трогаю, по крайней мере пока. В коде делаю модификацию вхождений блоков. И это всё работало нормально, до тех пор пока не потребовалось вызывать команды в 2016ом.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
И это всё работало нормально, до тех пор пока не потребовалось вызывать команды в 2016ом.
А в 2015-ом? А наличие установленного ServicePack для 2016?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн A77X7Автор темы

  • ADN OPEN
  • Сообщений: 20
  • Карма: 0
А в 2015-ом?
У нас только 2016й и 2014й (там через acedCmd работает)

Оффлайн A77X7Автор темы

  • ADN OPEN
  • Сообщений: 20
  • Карма: 0
А наличие установленного ServicePack для 2016?
Конкретно сейчас проверяю на AutoCAD 2016 MEP SP1

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
А acedCmdS вместо acedCmd в 2016?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение