Как изнутри сборки NET определить, загружена ли она в AutoCAD?

Автор Тема: Как изнутри сборки NET определить, загружена ли она в AutoCAD?  (Прочитано 9324 раз)

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

Оффлайн Алексей КуликАвтор темы

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
При разработке сборки столкнулся с ситуацией, когда часть функционала надо блокировать, если сборка вызывается не из-под AutoCAD, а из стороннего приложения.
Т.е. для тестирования используется чуть ли не консольное приложение, которое из проверяемой сборки вызывает какие-то формы, работает с БД и т.д. Но любые попытки вызвать часть функционала AutoCAD, естественно, вываливает Exception. Ставить try-catch, как мне кажется, так себе идея.
Можно ли проверить (и если да, то как), обращение к сборке выполняется из-под AutoCAD или нет?
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 822
  • Карма: 166
    • Мои плагины к Автокаду

Оффлайн Роман Малютин

  • ADN Club
  • Сообщений: 15
  • Карма: 3
  • Инженер
    • lep10.ru
Мне кажется эта задача должна решаться правильной архитектурой приложения, а не проверками.
Разделить всё минимум на три проекта:
1. Кадонезависимый функционал
2. Только работа с AUTOCAD, ссылается на 1.
3. Ваше консольное приложение, тоже ссылается на 1 и ничего не знает про 2.
В дальнейшем п.1 разделится ещё на составляющие в зависимости от сложности. Например отдельно выделить UI и остальные слои.

Оффлайн Алексей КуликАвтор темы

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
Это было бы правильно и здорово, но дополнение:
- досталось в наследство
- уже сидит у пользователей
- на нормальную переделку никто не дает ни времени, ни ресурсов
Первое, что пришло в голову - узнать, можно ли определить, работа ведется из-под када или все же из под консоли. И при этом не вводить в проект дополнительных конфигураций и переменных сборки.
P.S. Ко мне лучше на "ты" ;)
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 546
  • Карма: 119
можно ли определить, работа ведется из-под када или все же из под консоли.
А переменные в консоли работают? Может 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

Оффлайн Алексей КуликАвтор темы

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
Я плохо объяснил...
Есть NET-сборка, которая грузится в ACAD. Эту сборку надо постепенно переводить на нормальные рельсы. Я хочу подключить эту сборку как внешнюю dll в обычное windows-консольное приложение и обращаться к классам тестируемой сборки из-под windows-консоли. Соответственно любой функционал, завязанный на работу с AutoCAD, надо отключать. Вот я и хочу узнать, каким манером это можно сделать (если можно вообще).
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 546
  • Карма: 119
Я плохо объяснил...
да не все понятно, даже сейчас.

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

Соответственно любой функционал, завязанный на работу с AutoCAD, надо отключать.
Что значит отключать? Нужно определить какие классы обращаются к AutoCAD или как-то залезть в dll, модифицировать ее или что то еще?

Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 546
  • Карма: 119
Если будет больше информации, то будет проще подсказать.

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

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

 

Оффлайн Алексей КуликАвтор темы

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
Благодарю, попробую вникнуть! :)
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Но любые попытки вызвать часть функционала AutoCAD, естественно, вываливает Exception. Ставить try-catch, как мне кажется, так себе идея.
Идея вполне нормальная. Да и проверить можно однократно. Кстати, если ты используешь в этой сборке какие-то сборки из AutoCAD .NET API, то ты просто не сможешь воспользоваться этой сборкой вне AutoCAD, так как сборки из AutoCAD .NET API завязаны на acad.exe, acdbNN.dll и т.д. и не могут использоваться вне процесса AutoCAD.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей КуликАвтор темы

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
То есть мне сразу надо выполнять разделение функционала и делать отдельные сборки для работы с ACAD и "вне его"?
Голова уже что-то не варит, попробую на следующей неделе поковырять.
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

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

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

Оффлайн Lemieux

  • ADN OPEN
  • ****
  • Сообщений: 389
  • Карма: 21
Если не секрет, то что это за такой рабочий процесс, где нужны такие "велосипеды"?

Оффлайн Алексей КуликАвтор темы

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
Не секрет :) Процесс называется "[само]обучение в боевых условиях" :) При этом основная задача - ничего не порушить.
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Кстати, если ты используешь в этой сборке какие-то сборки из 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" вещи.