пятница, 11 апреля 2014 г.

О совместимости версий .NET плагинов, AutoCAD, .NET Framework и MS Visual Studio

Маленькая шпаргалка на тему совместимости версий .NET плагинов, AutoCAD, .NET Framework и MS Visual Studio. Вообще, Visual Studio можно использовать любую: главное, чтобы она поддерживала возможность писать код под нужную нам версию .NET Framework. Разные версии AutoCAD могут использовать разные версии .NET Framework и плагины, использующие эти платформы. Кроме того, некоторые управляемые плагины можно использовать в разных версиях AutoCAD без необходимости их перекомпиляции.

[R17.2] AutoCAD 2009: .NET 3.0, 3.5; Visual Studio 2005 и более новые.
[R18.0] AutoCAD 2010: .NET 3.5; Visual Studio 2005 и более новые.
[R18.1] AutoCAD 2011: .NET 3.5, 4.0, 4.5, 4.5.1 (см. примечание 1); Visual Studio 2005 и более новые.
[R18.2] AutoCAD 2012: .NET 4.0, 4.5, 4.5.1 (см. примечание 2); Visual Studio 2010 и более новые.
[R19.0] AutoCAD 2013: .NET 4.0, 4.5, 4.5.1 (см. примечание 2); Visual Studio 2010 и более новые.
[R19.1] AutoCAD 2014: .NET 4.0, 4.5, 4.5.1 (см. примечание 2); Visual Studio 2010 и более новые.
[R20.0] AutoCAD 2015: .NET 4.5, 4.5.1 (см. примечание 2); Visual Studio 2012 и более новые.
[R20.1] AutoCAD 2016: .NET 4.5, 4.5.1 (см. примечание 2); Visual Studio 2012 и более новые.

Особым образом хочется выделить AutoCAD 2010 и 2011. Официально компанией Autodesk заявлено, что эти версии требуют для своей работы Microsoft Visual Studio 2008 with Service Pack 1 и Microsoft .NET Framework 3.5 with Service Pack 1. Однако практика показывает, что если у программиста под рукой окажется только Visual Studio 2005 и AutoCAD 2011, то написать плагин он сможет. Но в виду того, что в Visual Studio 2005 нет возможности указать целевую версию платформы .NET, этот плагин будет компилироваться с использованием .NET 2.0. Соответственно, при написании плагина AutoCAD, программист будет ограничен рамками платформы .NET 2.0. Например, он не сможет использовать технологии LINQ и WPF.

Для примера, в Visual Studio 2005 автор написал и скомпилировал плагин для AutoCAD 2011, который успешно запустился в обозначенной версии AutoCAD:

   1:  using System;
   2:  using cad = Autodesk.AutoCAD.ApplicationServices
   3:  .Application;
   4:  using Rt = Autodesk.AutoCAD.Runtime;
   5:   
   6:  namespace acad_2011{
   7:      public class Class1 {
   8:          [Rt.CommandMethod("test", Rt.CommandFlags.Modal)]
   9:          public void Test(){
  10:              cad.DocumentManager.MdiActiveDocument
  11:                  .Editor.WriteMessage(
  12:                  "MS VS 2005: Hello, AutoCAD 2011!\n");
  13:          }
  14:      }
  15:  }

В подкаталоге inс установленного ObjectARX SDK, управляемые сборки появились лишь начиная с AutoCAD 2011. .NET плагины, использующие сборки AutoCAD только из этого каталога, можно без опасений компилировать как AnyCPU. В иных случаях нужно быть осторожным. Начиная с AutoCAD 2013 в обозначенном подкаталоге появился файл AcCoreMgd.dll. В новый файл было вынесено часть функционала из файла AcDbMgd.dll и часть из файла AcMgd.dll.

Небольшая переведённая мною на русский язык цитата, автором которой является Scott McFarlane [CP2654]:
В последние несколько лет компания Autodesk работала над разделением бизнес логики AutoCAD от логики взаимодействия с GUI. Такое разделение позволяет иметь единую кодовую базу, не зависящую от конкретной операционной системы (Windows, MacOS). Это разделение было названо "большим разделением" (The Big Split). Указанная работа была завершена в AutoCAD 2013 и теперь мы имеем трёх уровневую архитектуру, как показано ниже:




Важно понимать, что каждый уровень зависит от ниже расположенных уровней и не зависит от уровней расположенных выше. Два нижних уровня представляют собой механизм ядра AutoCAD (AutoCAD Core Engine). В виду высокой скорости своего запуска, помимо использования в пакетной обработке чертежей, приложение AcCoreConsole так же хорошо подходит и для проведения автоматического тестирования кода.

Теперь программный код рекомендуется писать разделяя его зависящую от AutoCAD API часть от той части, которая не зависит от AutoCAD API. Затем, часть кода, зависящую от AutiCAD API в свою очередь рекомендуется делить на две части: на ту, которая зависит лишь от базового уровня (библиотеки acdbmgd.dll и accoremgd.dll) и на ту, которая зависит от UI (acmgd.dll).

Начиная с AutoCAD 2013 SP1 был внедрён механизм безопасности загрузки в AutoCAD сторонних программных библиотек (подробнее здесь). Начиная с AutoCAD 2014, на вкладке Files диалогового окна Options присутствует ветка Trusted Locations.

Если вы написали управляемый плагин под одну версию AutoCAD, то сможете использовать его и для другой версии AutoCAD, в случае выполнения следующих условий:
1. Обе версии AutoCAD могут использовать ту версию .NET Framework, которая применялась при написании плагина (см. примечание 1).
2. К вашему плагину AutoCAD подключены библиотеки, присутствующие в обоих версиях AutoCAD.
3. Ваш плагин использует только ту часть API, которая присутствует в обоих рассматриваемых версиях AutoCAD.
4. Если управляемый плагин скомпилирован с опцией x86 или x64 (например, по причине использования Interop в вашем коде), то и целевые версии AutoCAD должны иметь ту же самую разрядность, что и плагин.

ВНИМАНИЕ!
Даже если выполнены все обозначенные выше условия, всё равно следует обязательно произвести тестирование (желательно с использованием NUnit или Gallio) вашего плагина на полную его совместимость с иными, интересующими вас версиями AutoCAD (т.е. загрузить плагин и проверить его работоспособность).

Примечание 1:
В AutoCAD 2011 конфигурационный файл acad.exe.config содержит закомментированные XML элементы, указывающие целевую версию .NET Framework:

   1:  <!--<startup useLegacyV2RuntimeActivationPolicy="true">
   2:  <supportedRuntime version="v4.0"/>
   3:  </startup>-->

В этом состоянии AutoCAD 2011 использует .NET 3.5, но если указанные выше XML элементы раскомментировать, то AutoCAD 2011 будет использовать наиболее новую версию .NET из тех которые приложение сможет найти и использовать. Применительно к AutoCAD 2011 это будут версии .NET 4.0, 4.5 и 4.5.1.

Примечание 2:
В отличие от AutoCAD 2011, в конфигурационных файлах AutoCAD 2012-2016 обозначенные в "Примечании 1" XML элементы по умолчанию раскомментированы.

Примечание 3:
Если вместо acad.exe используется accoreconsole.exe, то его конфигурационный файл, соответственно, следует искать под именем accoreconsole.exe.config.

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

Анонимный комментирует...

Спасибо, Андрей! Ценная информация! Шпаргалка устраняет неопределенность в вопросах совместимости на начальном этапе работы с .Net.

Михаил Загурский комментирует...

Здравствуйте Андрей. Пожалуйста скажите, как с Вами можно связаться? Я хочу задать Вам пару вопросов по теме этой статьи.

Андрей Бушман комментирует...

Здравствуйте Михаил. Поскольку вопросы относятся к данной заметке, то Вы можете задать их прямо здесь, в комментариях. Возможно они будут интересны ещё для кого-то, кто будет читать эту страничку.

Михаил Загурский комментирует...

В таком случае вопрос следующего характера:
У меня есть задача написать плагин для AutoCAD на C#. Этот плагин должен создавать большую пачку автоматически генерируемых документов (чертежи, схемы, что-то еще). Проблема в версионности.
В конторе, где я работаю, используют AutoCAD 2009, но при этом используют файлы формата AutoCAD 2004. Покопавшись в интернете, я нашел способ сохранять файлы dwg в более старых форматах.
У меня есть Visual Studio 2015, установлены Framework`и (2.0 - 4.6). Сверившись с вашей статьёй я попробовал накидать простой плагин (HelloWorld) в указанной версии Visual Studio для AutoCAD 2009. После компиляции команда netload сказала, что мой плагин использует неподдерживаемые версии .NET Framework.
Я пробовал версии 2.0, 3.0, 3.5, 4.0. Ни с одной из них AutoCAD работать не хочет.

Тогда я подумал, что возможно нужно написать отдельный exe файл, который будет делать всё то же самое (создавать файлы и т.д.). Но прочитал в сети, что у меня будет сильно урезанная функциональность.

В итоге я погряз в незнании/непонимании того, как мне совместить все версии в кучу.

Я хочу понять:
1) Выполнима ли задача написания плагина для старых версий AutoCAD в Visual Studio 2015?
2) Можно ли (с не которой долей уверенности) считать, что плагин для более новых версий можно будет достаточно легко поддерживать (переписывать на ещё более новые версии AutoCAD)?
3) Есть ли смысл уговорить начальство перейти на новые версии AutoCAD (при этом насколько трудно перевести файлы старого формата 2004 в новый 2017) ?

Что вообще можете сказать по такой задаче: AutoCAD 2009/dwg 2004/VS2015/Framework ?.0 ?

Спасибо.

Андрей Бушман комментирует...

> Я пробовал версии 2.0, 3.0, 3.5, 4.0. Ни с одной из них AutoCAD работать не хочет.

Такого не может быть в принципе.

1. Выполнима.

2. Как правило, я пишу код для AutoCAD 2009. Результат компиляции так же работает и в 2010-2012. Тот же самый код я компилирую для AutoCAD 2013. Результат компиляции так же работает и в 2014-2017. Использую Visual Studio 2015. Легко или тяжело поддерживать - это зависит от того, насколько сильно от версии к версии AutoCAD меняется та часть API, которая была задействована в коде плагина. За свою практику программирования под AutoCAD я не встречал серьёзных проблем в этом вопросе.

3. Я не работал с форматами DWG2004. Для формата DWG2007 трудностей в пересохранении в формат DWG2013 не замечал. Подозреваю, что и с DWG2004 их не будет. Решение о переходе или не переходе на новые версии AutoCAD должно приниматься аргументированно, на основе взвешивания всех "за" и "против", специфичных для вашей компании.

> Что вообще можете сказать по такой задаче: AutoCAD 2009/dwg 2004/VS2015/Framework ?.0 ?

Я не вижу никаких проблем в использовании обозначенной комбинации.

Михаил Загурский комментирует...

Андрей, большое спасибо за оперативный ответ!
Ваш комментарий сэкономил мне долгие часы поиска нужной информации и кучу нервов.
Имея на руках всю информацию с этой страницы, попробую разобраться с плагином, а также с начальством :-)

Ещё раз, спасибо!