Тема: код, выполняемый при загрузке .NET dll

господа, помогите найти или убедиться, что поиски тщетны. мне нужно, чтобы определенная функция выполнялась при загрузке .NET dll. в OBJECTARX можно так сделать, есть стартовая функция и выходная тоже есть, а в .NET так можно?

Re: код, выполняемый при загрузке .NET dll

http://autolisp.ru/2010/02/12/load-and-execute-dotnet/

Re: код, выполняемый при загрузке .NET dll

чудо - все работает! спасибо!

Re: код, выполняемый при загрузке .NET dll

Советую поискать результаты исследований, которые проводил Андрей Бушман aka hwd.

(изменено: Hwd, 24 ноября 2013г. 18:24:51)

Re: код, выполняемый при загрузке .NET dll

Нужно только помнить один момент: в сборке должно быть не более одного класса, реализовывающего IExtensionApplication, иначе начнутся "чудеса", аля "кто первый встал, того и тапки". Кроме этого, есть и другие "сюрпрайзы" - подробнее здесь.

Re: код, выполняемый при загрузке .NET dll

очень спасибо. раз уж такие знающие люди подключились - еще хочу спросить - а есть возможность отказать .NET dll в загрузке? ну типа как опять же в OBJECTARX на выходе дать REJECT и кодвыполняется, а сама dll в результате не грузится.

Re: код, выполняемый при загрузке .NET dll

По-моему, нет. Мы как раз сейчас с Андреем обсуждаем некоторые тонкости на autolisp.ru :)

(изменено: Hwd, 25 ноября 2013г. 08:42:32)

Re: код, выполняемый при загрузке .NET dll

Кулик Алексей aka kpblc пишет:

Мы как раз сейчас с Андреем обсуждаем некоторые тонкости

Там речь шла несколько о другом: о том, что поскольку .NET библиотеки грузятся в контекст приложения, а так же учитывая тот факт, что все сборки AutoCAD грузит в один общий домен (что не так уж и хорошо), то нет никакого смысла пытаться грузить их повторно в один и тот же AppDomain.

todesengel пишет:

а есть возможность отказать .NET dll в загрузке?

Насколько я знаю - средствами самого .NET нельзя. Можно подписаться на оповещение о факте успешной загрузке или же о проблемах, возникших при загрузке, а так же на событие выгрузки домена (см. события класса AppDomain). Например, если в процессе загрузки твоей библиотеки не удаётся найти нужные связанные с ней файлы, в обработчике события ты можешь указать, где искать эти файлы.

То, о чём ты спрашиваешь, компанией Autodesk могло было быть легко реализовано в API самого AutoCAD но, опять же - насколько я вижу, это сделано не было.

Re: код, выполняемый при загрузке .NET dll

мой интерес в этом очень простой
1. я пишу код в С#
2. компилирую его
3. запускаю автокад
4. пишу "netload <mycode>"
5. смотрю на результат
6. закрываю автокад

мне бы хотелось избавиться от шагов 3 и 6. в OBJECTARX я мог при загрузке ARX выполнить все, что мне нужно, а потом отказать ему в загрузке, и файл оставался свободным для перезаписи при последующей компиляции, а в .NET я вынуждем закрывать автокад, чтобы освободить файл, а потом снова запускать автокад. ясно, что все это потребляет время, особенно запуск автокада. а если для кода нужно, чтобы в автокаде был открыт определенный файл, то времени нужно еще больше...

(изменено: Hwd, 25 ноября 2013г. 08:57:15)

Re: код, выполняемый при загрузке .NET dll

ясно, что все это потребляет время, особенно запуск автокада.

Как вариант, можешь воспользоваться не acad.exe, а AcCoreConsole (в 2014-м его уже, в принципе, можно использовать). Это подойдёт в том случае, если тебе не нужен графический интерфейс AutoCAD, т. е. если тебе, к примеру, нужно программно поработать с DWG (уже имеющимися или новыми), после чего закрыть их.

Если тебе нужно работать с DWG вообще без наличия AutoCAD на машине, то рекомендую библиотеки ODA.

Re: код, выполняемый при загрузке .NET dll

о как интересно! можно без автокада? и это не REALDWG? гляну!

(изменено: Hwd, 25 ноября 2013г. 09:05:58)

Re: код, выполняемый при загрузке .NET dll

todesengel пишет:

о как интересно! можно без автокада? и это не REALDWG? гляну!

Можно, причём гораздо дешевле. Вот, к примеру, я в прошлом набросал кое-что с использованием этих библиотек.

А REALDWG правильней читать так: "UnrealDWG", ибо цены и условия использования подразумевают пожизненное рабство как твоё, так и твоих внуков. Оно тебе надо? :)

Re: код, выполняемый при загрузке .NET dll

todesengel пишет:

а есть возможность отказать .NET dll в загрузке?

Если мне не изменяет память, то достаточно вызвать исключение в методе Initialize

Re: код, выполняемый при загрузке .NET dll

Александр Ривилис пишет:

Если мне не изменяет память, то достаточно вызвать исключение в методе Initialize

Если это сделать, то да, команды, определённые в DLL не будут доступны. Однако я думаю, что вы неправильно поняли топикстартера. Полагаю, что он спрашивал, есть ли у него возможность программно блокировать загрузку чужих DLL, ежели они не удовлетворяют каким-то его требованиям.

Какой смысл ему блокировать загрузку своей же DLL? :)

Re: код, выполняемый при загрузке .NET dll

господин Ривилис верно меня понял, я же писал зачем мне это - я хочу отказать в загрузке DLL чтобы иметь возможность потом его менять не выгружая автокад.
однако я не умею вызывать exception. я написал в коде метода Initialize:
int.parse("jk");
однако DLL загрузился, хотя матод Initialize действительно прекратил свое выполнение.

Re: код, выполняемый при загрузке .NET dll

todesengel пишет:


господин Ривилис верно меня понял, я же писал зачем мне это - я хочу отказать в загрузке DLL чтобы иметь возможность потом его менять не выгружая автокад.


Не будут работать команды - это ещё не значит, что DLL не будет загружена. Ты можешь через Reflection в цикле вывести на консоль перечень загруженных сборок и увидишь, загружена она или нет. Подозреваю, что всё же загружена.
[quote=однако я не умею вызывать exception. я написал в коде метода Initialize:

int.parse("jk");


Тебе конструктор Visual Studio автоматом подставляет код генерации исключения (из контекстного меню интерфейса):

throw new NotImplementedException();


Похоже, что тебе для начала лучше бы книжки по C# почитать (меньше проблем будет).

todesengel]
я хочу отказать в загрузке DLL чтобы иметь возможность потом его менять не выгружая автокад.


Вообще, ты какую-то фигню придумываешь.