| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Почему в lisp отсутствует аналог функции (arxload ...) для .NET сборок.

Почему в lisp отсутствует аналог функции (arxload ...) для .NET сборок.

Ответ
Поиск в этой теме
Непрочитано 16.11.2010, 11:41 #1
Почему в lisp отсутствует аналог функции (arxload ...) для .NET сборок.
Pastor
 
это только кличка
 
Москва
Регистрация: 22.10.2006
Сообщений: 252

Столкнулся с вопросом автозагрузки нет-сборки.
Приходится использовать (command _.NETLOAD ...). В этом случае, при загрузке через acaddoc.lsp, можно нарваться на неприятности, поскольку согласно справки документ еще не до конца инициализирован и вызывать command настоятельно не рекомендуется. Приходится извращаться с s::startup. А поскольку в сообществе программистов единого соглашения по использованию этой функции не существует (насколько мне известно), то нарваться на неприяности шанс остается.
Ума не приложу, что мешало (мешает) автодеску добавить функцию, скажем (netload ...) - полный аналог (arxload...), но только для нет-сборок?
Может в тайне существует недокументированный вариант этой функции? Кто знает, подскажите.
__________________
...в шее моей жилы железные, и лоб мой - медный...
Просмотров: 3498
 
Непрочитано 16.11.2010, 12:08
#2
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Боюсь что autodesk уже давно "плюнул" на лисп. ИХМО непосредственно в лиспе, как минимум, за последние 5 версий НИЧЕГО не добавилось (хотя добавить безусловно есть что).
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 16.11.2010, 12:44
#3
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Рискую повториться, но все же рекомендую в acaddoc.lsp вызывать дочерний процесс и оттуда через sendcommand запускать команды.
Supermax вне форума  
 
Автор темы   Непрочитано 16.11.2010, 13:05
#4
Pastor

это только кличка
 
Регистрация: 22.10.2006
Москва
Сообщений: 252


Цитата:
Боюсь что autodesk уже давно "плюнул" на лисп
Так вопрос вовсе не в развитии лиспа как такового, а в том что в двух громадных новоиспечённых библиотеках AcDbMgd.dll и AcMgd.dll не нашлось места для десятка строк кода, экспортирующего нужную функцию.

Цитата:
Рискую повториться, но все же рекомендую в acaddoc.lsp вызывать дочерний процесс и оттуда через sendcommand запускать команды.
Каюсь, не слышал о таком способе. Но боюсь, что раз остается вызов команды NETLOAD, то остается и проблема - сделать этот вызов строго после полной инициализации документа (сам по себе вызов sendcommand этого никак не гарантирует).
__________________
...в шее моей жилы железные, и лоб мой - медный...
Pastor вне форума  
 
Непрочитано 16.11.2010, 13:08
#5
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,407
Отправить сообщение для Александр Ривилис с помощью Skype™


Самое смешное, что и из ObjectARX нет официальной функции для загрузки .NET-сборок. Хотя в whishlist это было и наверное когда-нибудь сделают.
Сборка acdbmgd.dll экспортирует функцию LoadManagedDll, которой передается один строчный параметр - путь к файлу сборки. Можно сделать arx-файл (но лень, т.к. потребуется делать такие файлы под все версии AutoCAD), который будет экспортировать в lisp функцию (netload <путь к файлу сборки>)

Последний раз редактировалось Александр Ривилис, 23.11.2010 в 09:05.
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 16.11.2010, 13:25
#6
Pastor

это только кличка
 
Регистрация: 22.10.2006
Москва
Сообщений: 252


Александр, а добраться до LoadManagedDll можно только через LoadLibrary() + GetProcAdress() или же где-то есть acdbmgd.lib?
__________________
...в шее моей жилы железные, и лоб мой - медный...

Последний раз редактировалось Pastor, 16.11.2010 в 13:39.
Pastor вне форума  
 
Непрочитано 16.11.2010, 13:50
#7
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,407
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от Pastor Посмотреть сообщение
Александр, а добраться до LoadManagedDll можно только через LoadLibrary() + GetProcAdress() или же где-то есть acdbmgd.lib?
Только так. Зато можно из VBA (только что проверил в AutoCAD 2008):
Код:
[Выделить все]
Public Declare Function LoadManagedDll Lib "acdbmgd.dll" (ByVal path As String) As Long

Public Sub NetLoad(str As String)
  Dim path As String
  path = StrConv(str, vbUnicode)
  Dim es As Long
  es = LoadManagedDll(path)
  If es <> 0 Then
    MsgBox "Error Netload: " + CStr(es)
  End If
End Sub
Соответственно можно попробовать из lisp'а через (vl-vbaload) и (vl-vbarun). Но как-то уж очень это извращенно.

P.S.: Проверял в x86 - для x64 возможно требуется модификация. В AutoCAD 2006 не нужна конвертация пути в Unicode

Последний раз редактировалось Александр Ривилис, 17.11.2010 в 00:38.
Александр Ривилис вне форума  
 
Непрочитано 16.11.2010, 23:24
#8
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
Самое смешное, что и из ObjectARX нет официальной функции для загрузки .NET-сборок.
И слава Богу... Чем не устраивает стандартный способ загрузки .Net?
Код:
[Выделить все]
...
AppDomain domain = AppDomain.CurrentDomain;
Assembly asm = Assembly.LoadFrom(fileName);
domain.Load(asm.FullName);
...
Только тем, что это реализация не доски?
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Автор темы   Непрочитано 17.11.2010, 00:03
#9
Pastor

это только кличка
 
Регистрация: 22.10.2006
Москва
Сообщений: 252


Цитата:
Чем не устраивает стандартный способ загрузки .Net?
Тем, что в native ObjectARX, и тем более в Autolisp, нет классов AppDomain и Assembly.

Есть еще один момент.
Assembly.LoadFrom() - штатный метод динамической загрузки сборок .NET, который ничего не знает об атрибутах [LispFunction("tram-param")] или [CommandMethod(...)]. Сейчас не могу проверить, но выскажу опасение, что функции помеченные данными атрибутами не будут при загрузке обработаны особым образом, а значит внешние функции и команды, определенные в сборке, загружаемой через LoadFrom(), будут попросту проигнорированы (т.е. их не окажется среди функций и команд AutoCAD). Это же касается и класса, реализующего IExtensionApplication. Рад буду, если ошибаюсь.
Проверьте, плиз, кому не лень.
__________________
...в шее моей жилы железные, и лоб мой - медный...

Последний раз редактировалось Pastor, 17.11.2010 в 00:14.
Pastor вне форума  
 
Непрочитано 17.11.2010, 00:31
#10
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,407
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от Pastor Посмотреть сообщение
Сейчас не могу проверить, но выскажу опасение, что функции помеченные данными атрибутами не будут при загрузке обработаны особым образом, а значит внешние функции и команды, определенные в сборке, загружаемой через LoadFrom(), будут попросту проигнорированы (т.е. их не окажется среди функций и команд AutoCAD). Это же касается и класса, реализующего IExtensionApplication. Рад буду, если ошибаюсь.
В AutoCAD 2006 в свое время проверял - работает. Обработка функций, помеченных атрибутами происходит судя по всему не в момент загрузки, а в момент вызова функции/команды.

P.S.: Hwd - когда я говорю про ObjectARX я ни при каких условиях не имею в виду .NET
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 17.11.2010, 00:51
#11
Pastor

это только кличка
 
Регистрация: 22.10.2006
Москва
Сообщений: 252


А что с IExtensionApplication? Ведь там может быть код инициализации, проигнорировать который - смерти подобно.
__________________
...в шее моей жилы железные, и лоб мой - медный...
Pastor вне форума  
 
Непрочитано 17.11.2010, 01:01
#12
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,407
Отправить сообщение для Александр Ривилис с помощью Skype™


Проверь :-)
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 17.11.2010, 01:03
#13
Pastor

это только кличка
 
Регистрация: 22.10.2006
Москва
Сообщений: 252


Обязательно проверю в ближайшее время и должу.
Всем спать
__________________
...в шее моей жилы железные, и лоб мой - медный...
Pastor вне форума  
 
Непрочитано 17.11.2010, 07:57
#14
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от Pastor Посмотреть сообщение
Обязательно проверю в ближайшее время и должу.
Можешь не проверять - всё работает корректно (и атрибуты и интерфейс) - у моих пользователь загрузчик именно так и грузит .Net-плагины (Acad 2009).

Имхо - проблем и не должно было возникнуть, т.к. .Net абсолютно фиолетово, какие атрибуты и интерфейсы прикручены к классам/методам, ведь они нужны не .Net, а AutoCAD и именно он (AutoCAD) через Reflection (т.е. средствами .Net) анализирует сборку, которая загружена в ему принадлежащий домен и на основе полученной информации реализует нужную ему логику.

Цитата:
Сообщение от Александр Ривилис
Hwd - когда я говорю про ObjectARX я ни при каких условиях не имею в виду .NET
Ясно. Я воспринял фразу в контексте .net (по привычке)

P.S. Касательно загрузки плагинов:
писал когда-то загрузчик плагинов в AutoCAD - старая версия решения (грузит ARX/.Net/Lisp) здесь.

Offtop:
Имеется более "свежий" вариант загрузки (его я пока не опубликовывал) - в нём процесс загрузки разделён на три этапа:
1. Сначала грузятся плагины, определённые как обязательные к загрузке для всех пользователей домена
2. Затем грузятся все библиотеки, определённые к обязательному использованию в рамках конкретной доменной группы (если юзер состоит более чем в 1 группе - грузятся библиотеки, определённые для каждой из этих групп)
3. На последнем этапе грузятся библиотеки, определённые самим пользователем к обязательной загрузке

В эту же версию добавил загрузку и VBA (пусть уж будет, до полноты). Дабы не назначать каждому юзеру права на удалённую загрузку (через caspol.exe), сделал так, чтобы копии плагинов хранились на локальных машинах юзеров, а при запуске автокада происходила односторонняя синхронизация с серверным содержимым, после чего библиотеки грузятся с локальной машины (т.о. отпала надобность в использвании caspol.exe). Админ с помощью конфигурационных файлов управляет синхронизацией (может отменить её для всех/для конкретной доменной группы/для конкретного пользователя, либо указать что именно должно быть синхронизировано, а всё остальное не проверять - т.о. экономится время на проверку).
Работает как часы, правда всё не выберу время GUI к нему прикрутить - в случае необходимости приходится конфиг-файлы в текстовом редакторе править, правда в виду того, что загрузка выполняется на основе фильтров, то при добавлении на сервер новой библиотеки, она автоматом копируется на локальные машины - т.е. пока править вручную конфиги не приходилось, но потенциально такая потребность может возникнуть, поэтому желательно GUI всё же прикрутить.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:

Последний раз редактировалось hwd, 17.11.2010 в 08:33.
hwd вне форума  
 
Автор темы   Непрочитано 17.11.2010, 11:56
#15
Pastor

это только кличка
 
Регистрация: 22.10.2006
Москва
Сообщений: 252


To hwd.
в вашем загрузчике есть непонятное для меня место
Код:
[Выделить все]
AppDomain domain = AppDomain.CurrentDomain;
...
Assembly asm = Assembly.LoadFrom(file);
domain.Load(asm.FullName);
...
Зачем вы грузите одну и ту же сборку дважды? Согласно MSDN метод Assembly.LoadFrom() грузит сборку в текущий (вызывающий) домен и domain.Load(asm.FullName) грузит ту же сборку точно туда же.
__________________
...в шее моей жилы железные, и лоб мой - медный...
Pastor вне форума  
 
Непрочитано 17.11.2010, 11:58
#16
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,407
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от Pastor Посмотреть сообщение
Зачем вы грузите одну и ту же сборку дважды?
Это Андрей переборщил.
Александр Ривилис вне форума  
 
Непрочитано 17.11.2010, 13:15
#17
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
Это Андрей переборщил.
Да, так и есть.
> Pastor
Спасибо за замечание - исправлю.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Почему в lisp отсутствует аналог функции (arxload ...) для .NET сборок.

Размещение рекламы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Аналог функции EVAL (LISP) в Exele kp+ LISP 11 01.04.2010 16:52