Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: Georg от 01-01-2022, 15:50:04

Название: Как ограничивать версии API для отдельных методов/участков кода?
Отправлено: Georg от 01-01-2022, 15:50:04
Доброго дня, такой вопрос ... чтобы сделать код универсальным для разных версий API (где используется библиотека) иногда делают такие вставки:

Код - C# [Выбрать]
  1. #if AUTOCAD_2009
  2.         defaultMText.TextStyle =
  3.           textStyle.ObjectId;
  4. #else
  5.         defaultMText.TextStyleId =
  6.           textStyle.ObjectId;
  7. #endif

А где документировано как это использовать? Вводится типа "область видимости" для конкретных библиотек (сборок) API? В частности я вот использовал новейшие Update's (Civil 3D 2022.1), и библиотеки вообще не работают у пользователя с голым 2022 (даже если эти функции не задействуются) ... как такие конструкции применять?
Название: Re: Как ограничивать версии API для отдельных методов/участков кода?
Отправлено: Александр Ривилис от 01-01-2022, 17:05:18
Georg,
Собственно говоря есть два варианта:
1) Использовать препроцессор (как в твоем коде) и тогда нужно компилировать под разные версии, получая разные dll-файлы. Пример можно подсмотреть в MGDDBG: https://adn-cis.org/forum/index.php?topic=7274.0
2) Использовать Reflection для вызова методов/свойств в зависимости от версии AutoCAD/Civil (проверяя версию). Проверить версию можно различными способами. Некоторые из них озвучены здесь: https://adn-cis.org/forum/index.php?topic=10315.0
И еще обсуждалось здесь: https://adn-cis.org/forum/index.php?topic=10180.0
В частности я вот использовал новейшие Update's (Civil 3D 2022.1), и библиотеки вообще не работают у пользователя с голым 2022 (даже если эти функции не задействуются)
А вот это странно. Нужно эти проблемы диагностировать, так как такого быть не должно. Что происходит? Не грузится эта dll или происходит Exception при выполнении кода из неё?
Название: Re: Как ограничивать версии API для отдельных методов/участков кода?
Отправлено: Georg от 01-01-2022, 18:50:02
Тут библиотека используется в Dynamo ... а у него логика видать такая, что если библиотека содержит методы, не регламентированные/не существующие в рамках данных системных библиотек текущей версии, пользователь вообще не увидит ни один метод библиотеки ... и там увы только 1 dll может использоваться  :-\ :-\ :-\. Платформа отвратительная по части "нормального кода", одни костыли и ограничения ... Вариант с несколькими dll не прокатит даже, так как эта библиотека при загрузке никак не прогружается в программу. Смотрится заголовочная строка dll (под какую крайнюю версию он собирался) и если используемые зависимости новее текущего будет ошибка.
(https://i.postimg.cc/BPGLdtz0/image.png) (https://postimg.cc/BPGLdtz0)
Для случая "классического плагина" да, большое спасибо за варианты, буду их использовать, а тут боюсь ничего не поможет (только управлять версиями пакета добавляя/убирая методы из свежих релизов). Либо выводя это в отдельный "пакет методов/бибилиотеку", но это неудобно с позиции обновления таких частей.