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

ADN Club => AutoCAD .NET API => Тема начата: Алексей Кулик от 12-03-2021, 15:59:25

Название: Как изнутри сборки NET определить, загружена ли она в AutoCAD?
Отправлено: Алексей Кулик от 12-03-2021, 15:59:25
При разработке сборки столкнулся с ситуацией, когда часть функционала надо блокировать, если сборка вызывается не из-под AutoCAD, а из стороннего приложения.
Т.е. для тестирования используется чуть ли не консольное приложение, которое из проверяемой сборки вызывает какие-то формы, работает с БД и т.д. Но любые попытки вызвать часть функционала AutoCAD, естественно, вываливает Exception. Ставить try-catch, как мне кажется, так себе идея.
Можно ли проверить (и если да, то как), обращение к сборке выполняется из-под AutoCAD или нет?
Название: Re: Как изнутри сборки NET определить, загружена ли она?
Отправлено: avc от 12-03-2021, 16:12:09
del
Название: Re: Как изнутри сборки NET определить, загружена ли она в AutoCAD?
Отправлено: Роман Малютин от 12-03-2021, 19:14:22
Мне кажется эта задача должна решаться правильной архитектурой приложения, а не проверками.
Разделить всё минимум на три проекта:
1. Кадонезависимый функционал
2. Только работа с AUTOCAD, ссылается на 1.
3. Ваше консольное приложение, тоже ссылается на 1 и ничего не знает про 2.
В дальнейшем п.1 разделится ещё на составляющие в зависимости от сложности. Например отдельно выделить UI и остальные слои.
Название: Re: Как изнутри сборки NET определить, загружена ли она в AutoCAD?
Отправлено: Алексей Кулик от 12-03-2021, 19:23:27
Это было бы правильно и здорово, но дополнение:
- досталось в наследство
- уже сидит у пользователей
- на нормальную переделку никто не дает ни времени, ни ресурсов
Первое, что пришло в голову - узнать, можно ли определить, работа ведется из-под када или все же из под консоли. И при этом не вводить в проект дополнительных конфигураций и переменных сборки.
P.S. Ко мне лучше на "ты" ;)
Название: Re: Как изнутри сборки NET определить, загружена ли она в AutoCAD?
Отправлено: Привалов Дмитрий от 12-03-2021, 20:28:56
можно ли определить, работа ведется из-под када или все же из под консоли.
А переменные в консоли работают? Может PRODUCT или PROGRAM выдаст что-то отличное?

ACADVER = 18.0s (LMS Tech)
_VERNUM = D.309.0.0 (UNICODE)
_PKSER = серийник
PLATFORM = Microsoft Windows NT Version 6.2 (x64)
PRODUCT = AutoCAD
PROGRAM = acad
Название: Re: Как изнутри сборки NET определить, загружена ли она в AutoCAD?
Отправлено: Алексей Кулик от 12-03-2021, 20:35:23
Я плохо объяснил...
Есть NET-сборка, которая грузится в ACAD. Эту сборку надо постепенно переводить на нормальные рельсы. Я хочу подключить эту сборку как внешнюю dll в обычное windows-консольное приложение и обращаться к классам тестируемой сборки из-под windows-консоли. Соответственно любой функционал, завязанный на работу с AutoCAD, надо отключать. Вот я и хочу узнать, каким манером это можно сделать (если можно вообще).
Название: Re: Как изнутри сборки NET определить, загружена ли она в AutoCAD?
Отправлено: Привалов Дмитрий от 12-03-2021, 20:46:14
Я плохо объяснил...
да не все понятно, даже сейчас.

Эту сборку надо постепенно переводить на нормальные рельсы.
Что значит переводить на нормальные рельсы?
Исходники то есть?

Соответственно любой функционал, завязанный на работу с AutoCAD, надо отключать.
Что значит отключать? Нужно определить какие классы обращаются к AutoCAD или как-то залезть в dll, модифицировать ее или что то еще?
Название: Re: Как изнутри сборки NET определить, загружена ли она в AutoCAD?
Отправлено: Привалов Дмитрий от 12-03-2021, 21:33:03
Если будет больше информации, то будет проще подсказать.

Определить, какой процесс использует библиотеку dll
http://markimarta.ru/windowsos/opredelit-kakoj-process-ispolzuet-biblioteku-dll.html

CurrentDomain: домен текущего приложения
https://metanit.com/sharp/tutorial/18.2.php

 
Название: Re: Как изнутри сборки NET определить, загружена ли она в AutoCAD?
Отправлено: Алексей Кулик от 12-03-2021, 21:45:14
Благодарю, попробую вникнуть! :)
Название: Re: Как изнутри сборки NET определить, загружена ли она в AutoCAD?
Отправлено: Александр Ривилис от 12-03-2021, 21:48:46
Но любые попытки вызвать часть функционала AutoCAD, естественно, вываливает Exception. Ставить try-catch, как мне кажется, так себе идея.
Идея вполне нормальная. Да и проверить можно однократно. Кстати, если ты используешь в этой сборке какие-то сборки из AutoCAD .NET API, то ты просто не сможешь воспользоваться этой сборкой вне AutoCAD, так как сборки из AutoCAD .NET API завязаны на acad.exe, acdbNN.dll и т.д. и не могут использоваться вне процесса AutoCAD.
Название: Re: Как изнутри сборки NET определить, загружена ли она в AutoCAD?
Отправлено: Алексей Кулик от 12-03-2021, 21:55:57
То есть мне сразу надо выполнять разделение функционала и делать отдельные сборки для работы с ACAD и "вне его"?
Голова уже что-то не варит, попробую на следующей неделе поковырять.
Название: Re: Как изнутри сборки NET определить, загружена ли она в AutoCAD?
Отправлено: Александр Ривилис от 12-03-2021, 21:59:24
То есть мне сразу надо выполнять разделение функционала и делать отдельные сборки для работы с ACAD и "вне его"?
100%
Название: Re: Как изнутри сборки NET определить, загружена ли она в AutoCAD?
Отправлено: Lemieux от 13-03-2021, 08:58:42
Если не секрет, то что это за такой рабочий процесс, где нужны такие "велосипеды"?
Название: Re: Как изнутри сборки NET определить, загружена ли она в AutoCAD?
Отправлено: Алексей Кулик от 13-03-2021, 09:41:44
Не секрет :) Процесс называется "[само]обучение в боевых условиях" :) При этом основная задача - ничего не порушить.
Название: Re: Как изнутри сборки NET определить, загружена ли она в AutoCAD?
Отправлено: Дмитрий Загорулькин от 15-03-2021, 10:22:56
Кстати, если ты используешь в этой сборке какие-то сборки из AutoCAD .NET API, то ты просто не сможешь воспользоваться этой сборкой вне AutoCAD, так как сборки из AutoCAD .NET API завязаны на acad.exe, acdbNN.dll и т.д. и не могут использоваться вне процесса AutoCAD.
Можно воспользоваться, если не вызывать обращения к библиотекам автокада. Я так тестирование частичное делал для сборок. Но это очень тонкий лёд, конечно...
Определить, какой процесс использует библиотеку dll
http://markimarta.ru/windowsos/opredelit-kakoj-process-ispolzuet-biblioteku-dll.html

CurrentDomain: домен текущего приложения
https://metanit.com/sharp/tutorial/18.2.php
Да, надо смотреть именно эти направления. Не должно использоваться ничего из AutoCAD API. Только рефлексия и т.п. "чисто NET" вещи.
Название: Re: Как изнутри сборки NET определить, загружена ли она в AutoCAD?
Отправлено: Алексей Кулик от 15-03-2021, 10:29:33
Спасибо, буду ковыряться. Ох и страшно ж, елки-моталки! :)