v2017. Не исполняется DLL на целевом компьютере

Автор Тема: v2017. Не исполняется DLL на целевом компьютере  (Прочитано 7257 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн Юрий КузнецовАвтор темы

  • ADN OPEN
  • Сообщений: 11
  • Карма: 0
Здравствуйте господа хорошие.
В качестве писателя я у вас в первый раз (как читатель - можно сказать живу тут), но.. вперся, а время жмет.
На целевой машине dll грузится (NETLOAD - не ругается), но ее команды не выполняются - "неизвестная команда".
На своей - все как часы. OS & AutoCAD - полностью идентичны. Куда копать? Подскажите, плиз

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Причин может быть множество. Например:
1. DLL-файл заблокирован при передаче через интернет. Нужно разблокировать:

2. CopyLocal установлено в True вместо False для acdbmgd.dll, acmgd.dll, accoremgd.dll
3. Возникает исключение в методе Initialize.
4. Используется неустановленная версия .NET Framework
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Юрий КузнецовАвтор темы

  • ADN OPEN
  • Сообщений: 11
  • Карма: 0
1. Явное копирование DLL в корень акадовской папки
2. CopyLocal всех трех - false
3. "Initialize" - такого метода у меня нет
4. .NET Framework - 4.6

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
3. "Initialize" - такого метода у меня нет
Ты в этом уверен?
Это метод интерфейса IExtensionApplication.Initialize(), который вызвается при загрузке dll-файла по NETLOAD
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
4. .NET Framework - 4.6
Версия AutoCAD? Версия Windows?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
1. Явное копирование DLL в корень акадовской папки
Это не значит, что файл разблокирован. Если его передали через интернет, то как его не копируй он останется заблокированным.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Юрий КузнецовАвтор темы

  • ADN OPEN
  • Сообщений: 11
  • Карма: 0
целевой комп на соседнем столе
AutoCad - 2017
Windows - 7-ка
NETLOAD я сам набираю в командной строке Акада на целевой машине, если исключение есть - я должен был это увидеть?

У меня в свойствах проекта "целевая рабочая среда" - стоит ".Net Framework 4.6. Но и на моей и на целевой самая свежая папка "C:\Windows\Microsoft.NET\Framework\v4.0.30319". Но на моем компе прога работает..

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
NETLOAD я сам набираю в командной строке Акада на целевой машине, если исключение есть - я должен был это увидеть?
Нет. AutoCAD сам при запуске метода Initialize перехватывает исключения. Но если исключение возникает, то команды не регистрируются.
У меня в свойствах проекта "целевая рабочая среда" - стоит ".Net Framework 4.6. Но и на моей и на целевой самая свежая папка "C:\Windows\Microsoft.NET\Framework\v4.0.30319". Но на моем компе прога работает..
Имя папки никакого отношения к версии .NET Framework не имеет. Если установлен AutoCAD 2017, то можно использовать .NET Framework 4.6 - он устанавливается (если его не было) при установке AutoCAD.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
целевой комп на соседнем столе
dll-файл передаешь на флешке или по локальной сети?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Юрий КузнецовАвтор темы

  • ADN OPEN
  • Сообщений: 11
  • Карма: 0
по сети

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
по сети
Значит проверь блокировку.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Юрий КузнецовАвтор темы

  • ADN OPEN
  • Сообщений: 11
  • Карма: 0
блокировки нет.
То что я загрузил на целевую Debug-версию Dll может влиять..?

Отмечено как Решение Юрий Кузнецов 15-03-2021, 14:01:22

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
То что я загрузил на целевую Debug-версию Dll может влиять..?
Да. Нужно грузить Release (хотя Debug часто тоже работает).
Ну и вставь отладочную печать в Initialize.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Юрий КузнецовАвтор темы

  • ADN OPEN
  • Сообщений: 11
  • Карма: 0
А как отловить этот метод Initialize, сори, если это очень просто..

Оффлайн Юрий КузнецовАвтор темы

  • ADN OPEN
  • Сообщений: 11
  • Карма: 0
Еде одно большое "сори" - у меня достаточно большой проект - десятки команд из под Акада, бизнес логика, математика.. эти библиотеки (которые Акад не задействуют, но из под команд для него написанных вызываются) они у меня лежат рядом с основной DLL, которая для Акада.. может быть дело в их взаимодействии?

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
может быть дело в их взаимодействии?
Запросто. Поэтому я и написал, что вариантов много. Начни с отладочной печати.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
А как отловить этот метод Initialize, сори, если это очень просто..
Его не нужно отлавливать. Он просто у тебя должен быть. Должен быть класс, который реализует интерфейс IExtensionApplication, у которого методы Initialize и Terminate. Тебя должен сейчас интересовать только метод Initialize.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Lemieux

  • ADN OPEN
  • ****
  • Сообщений: 384
  • Карма: 21
3. "Initialize" - такого метода у меня нет
Ты в этом уверен?
Это метод интерфейса IExtensionApplication.Initialize(), который вызвается при загрузке dll-файла по NETLOAD
Может человек весь свой проект запилил на [CommandMethod...]?
PS Хотя очень странная тема.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Может человек весь свой проект запилил на [CommandMethod...]?
Теоретически это возможно. Но тогда непонятно как отловить причину, по которой эта dll-ка некорректно грузится (или не грузится) в AutoCAD.
Вполне возможно, что если она связана с другими dll-файлами (native или managed) и не находит их, то сообщений никаких не возникает, но сборка не грузится и не работает.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Юрий КузнецовАвтор темы

  • ADN OPEN
  • Сообщений: 11
  • Карма: 0
Может человек весь свой проект запилил на [CommandMethod...]?
PS Хотя очень странная тема.
Скорее всего именно так.. хотя и не осознанно.. а как лучшие практики советуют?

Оффлайн Юрий КузнецовАвтор темы

  • ADN OPEN
  • Сообщений: 11
  • Карма: 0
Интерфейс IExtensionApplication не использовал (даже не знал о его существовании). Осознал..

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Интерфейс IExtensionApplication не использовал (даже не знал о его существовании). Осознал..
Кстати, в Initialize() ты можешь загрузить нужные тебе сборки.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Юрий КузнецовАвтор темы

  • ADN OPEN
  • Сообщений: 11
  • Карма: 0
Кстати, в Initialize() ты можешь загрузить нужные тебе сборки.
Ок, синкс

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
На целевой машине dll грузится (NETLOAD - не ругается), но ее команды не выполняются - "неизвестная команда".
На своей - все как часы. OS & AutoCAD - полностью идентичны.
Я бы для начала убедился, что на целевой машине действительно всё ок. Для этого написал бы самый простой командный "хелловорд" и проверил бы, что он грузится и выполняется.
И ещё стоит проверить на третьей машине проблемную dll. Если запустится, то проблема может быть совсем не в dll.

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
1. Явное копирование DLL в корень акадовской папки
Зачем такое варварство? Советую таким не злоупотреблять. Не надо делать склад из сторонних приложений и их вспомогательных библиотек в системных папках AutoCAD. Лучше cделать отдельную папку для "довесков", типа C:\AcadSupport (или на другом диске, если их несколько в системе), прописать эту папку и вложенные в неё как доверенные в настройках AutoCAD и класть различные загружаемые вручную приложения туда. Можно ещё делать подпапки, типа LISP, Net и т.п.

Оффлайн Юрий КузнецовАвтор темы

  • ADN OPEN
  • Сообщений: 11
  • Карма: 0
Зачем такое варварство? Советую таким не злоупотреблять. Не надо делать склад из сторонних приложений и их вспомогательных библиотек в системных папках AutoCAD. Лучше cделать отдельную папку для "довесков", типа C:\AcadSupport (или на другом диске, если их несколько в системе), прописать эту папку и вложенные в неё как доверенные в настройках AutoCAD и класть различные загружаемые вручную приложения туда. Можно ещё делать подпапки, типа LISP, Net и т.п.
Так и сделал уже, синкс. Добавил Initialize. Перекомпилял в Realise и.. все заработало!!!.. на трех машинах потестил.. и на всех заработало!!! Спасибо, мужики!!!


Оффлайн Lemieux

  • ADN OPEN
  • ****
  • Сообщений: 384
  • Карма: 21
Может человек весь свой проект запилил на [CommandMethod...]?
PS Хотя очень странная тема.
Скорее всего именно так.. хотя и не осознанно.. а как лучшие практики советуют?
В своём САПРе я делал так. Все .dll лежат в .bundle. Есть общая .dll, которая потом грузит остальные .dll. Во всех .dll (лично в моём проекте) реализуется интерфейс IExtensionApplication: общая .dll грузит другие .dll, а те в свою очередь инициализируют свои ленты и грузят команды через Utils.AddCommand (но это необязательно, можно просто через [CommandMethod]).