пятница, 17 апреля 2015 г.

Шаблоны проектов для управляемых расширений AutoCAD

Опубликовал шаблоны для разработки и тестирования управляемых расширений для AutoCAD и вертикальных решений на его базе.

Страничка проекта находится здесь. Документация, примеры кода и демонстрационное видео так же присутствуют (ссылки на видео указаны в разделе Additional resources файла справочной системы).

Конструктивные замечания и предложения по теме приветствуются.

8 комментариев:

Boxa комментирует...

Вопрос по шаблону.
В шаблоне, для каждого проекта создается библиотека EntryPoint, причем она одна и та же для разных библиотек, смотрит на своё имя и ищет, что загружать.
Собственно не проще ли ее убрать из шаблона и собрав один раз, просто копировать и переименовывать, под нужную сборку?

Andrey Bushman комментирует...

1. EntryPoint будет формироваться только если в проекте будет объявлен символ компиляции ENTRY_POINT.
2. Код файла EntryPoint.cs для каждого проекта уникален в том, что класс EntryPoint размещается в пространстве имён, специфичном для текущего проекта.
3. Если возникнет необходимость для конкретного проекта внести уникальные изменения в логику, то наличие файла EntryPoint.cs позволяет это сделать.
4. Обозначенные мною идеи не претендуют на совершенство. :)

Boxa комментирует...

EntryPoint будет формироваться только если в проекте будет объявлен символ компиляции ENTRY_POINT.
Это понятно, и вполне очевидно.
Код файла EntryPoint.cs для каждого проекта уникален в том, что класс EntryPoint размещается в пространстве имён, специфичном для текущего проекта.
Это для ограничения запуска библиотек в обход EntryPoint? Просто ничего больше в голову не приходит, состряпать синглтон и проверять его наличие из основного модуля...
Если возникнет необходимость для конкретного проекта внести уникальные изменения в логику, то наличие файла EntryPoint.cs позволяет это сделать
Реально, была потребность в изменениях (Загрузку под другую платформу пока не рассматриваю)? Нужно больше данных, допускаю, что я что-то не учёл...

Andrey Bushman комментирует...

>Это для ограничения запуска библиотек в обход EntryPoint?
Если библиотека будет просто копироваться в разные проекты, то в AutoCAD она будет грузиться только один раз и, соответственно, выполнять поиск нужной DLL будет так же только один раз, т.к. одна и та же сборка в один AppDomain грузится только один раз. Соответственно, первый плагин, использующий эту библиотеку будет успешно загружен, а вот все остальные... Подозреваю, что переименованием тут дело не решится (не проверял).

Andrey Bushman комментирует...

> Реально, была потребность в изменениях (Загрузку под другую платформу пока не рассматриваю)?

Я стараюсь не ждать, когда упрусь в подобную ситуацию и заблаговременно оставляю места для манёвров. :) Может понадобится, а может и нет, но лучше пусть это будет сразу предусмотрено, чем потом кусать себя за локти.

Boxa комментирует...

Еще вопрос, Ты не пробовал в этот шаблон, в EntiryPoint добавить проверку новых версий?

Т.е. что бы в основном потоке происходил поиск файлов, которые нужно загрузить, не только в соответствии с версией акад, но и версия библиотеки чтоб была самая свежая.
А в фоновом потоке качать с сервера новую версию dll, если она есть конечно.
Я так понимаю, что при таком подходе при следующей загрузке акада будет загружаться обновленная версия и так можно будет решить проблему исправления своих косяков.
Хотя, имхо, админы такому подходу будут не рады...

Andrey Bushman комментирует...

Я успешно использовал этот шаблон для создания нескольких своих проектов. Однако в дальнейшем решил им более не пользоваться по ряду причин:

1. Насколько я понял, уровень знаний механизма MSBuild у большинства программистов пишущих код под AutoCAD - чуть ниже чем нулевой и желания повышать его ни у кого нет. В виду этого редактирование настроек подобных шаблонов или проектов, созданных на их основе, для таких программистов будет китайской азбуке подобно. А читать MSDN по теме - мало кто захочет. Из тех же, кто вообще интересовался работой MSBuild я знаю только CAD Bloke...

2. Visual Studio, к сожалению, пока не способна использовать функционал MSBuild по полной. В виду этого, кое-где, файлы пользовательских свойств приходится формировать с учётом специфики их восприятия этой IDE. Кроме того, VS автоматически отслеживает изменения только свозданных ею файлов проекта, но не отслеживает изменения пользовательских файлов настроек - это приходится учитывать при планировании архитектуры шаблона.

3. NuGet не способен автоматически определять выполненные изменения конфигураций проекта (хотя бы так, как это способна делать IDE), и реагировать на них должным образом: переключаться на соответствующие версии библиотек, загруженных с его помощью. Т.о. использование этих шаблонов автоматом подразумевает НЕ использование NuGet.

4. Традиционноый набор проектов, компилируемых на основе одних и тех же исходников, является более удобным и в виду этого менее подверженным ошибкам. Если выбирать между простотой и компактностью, то всё же лучше выбирать простоту. Пусть возни будет больше, но зато она будет более понятной разработчику.

5. EntryPoint демонстрирует, как одна и та же библиотека, при определённых условиях, может быть успешно загружена в любую версию AutoCAD начиная с 2009 и выше (более старые не проверял). Эту особенность можно использовать для определения подходящей версии библиотеки и загрузке её в AutoCAD (что собственно и делает EntryPoint). Однако, начиная с AutoCAD 2012 и выше наличие механизма BUNDLE пакетов в AutoCAD позволяет обойтись без EntryPoint, обозначив логику загрузок в конфигурационном файле расширения.

6. То, что у меня в шаблонах названо автономными тестами (Unit Tests), на самом деле являются тестами интеграционными (Integration Tests). Для создания автономных тестов необходимо использовать не Gallio или NUnit, но другие фрэймворки, такие как JustMock или TypeMock. Оба вида тестов (автономные и интеграционные) важны, но их следует разделять по отдельным проектам.

7. По поводу обновлений... Решение об установке обновлений должен принимать администратор CAD, а не плагин сам по себе. Он закачивает обновления из Интернета один раз на сервер и все клиенты обновляют свои плагины уже скачивая с сервера, вместо того, чтобы дружно загружать Интернет-трафик.

Boxa комментирует...

Спасиб за развернутый ответ. Нет в мире совершенства... Буду дальше ковыряться.