Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > Как сделать .dll с "DllMain"?


Автор: GoldFinch 25.4.2010, 18:45
Как сделать .dll, у которой при загрузке будет выполняться пользовательский код?
Нечто вроде DllMain, но достаточно вызывать этот только при загрузке .dll-ки

Язык - например C#, версия .NET 2-4.

=================

Пока что придумал способ делать .exe, потом править его загловок чтобы он стал .dll, дописывать к нему стаб c DllEntryPoint, который при DLL_PROCESS_ATTACH будет создавать поток, который будет вызывать оригинальную точку входа .exe или сразу mscoree._CorExeMain.

Автор: Любитель 25.4.2010, 19:24
Ээ.. А зачем это нужно?
Вообще говоря, для этого прописывается глобальны статик-конструктор, если речь про CIL. Физически, правда, глобального в дотнете ничего не может быть, поэтому генерируется специальный класс с именем <Module>. Из-под шарпа - в 99% случаев хватает статик-конструкторов. На крайний раз, можно прописать в after build степы патчинг сборки (для добавления статик конструктора к <Module>).

Автор: GoldFinch 25.4.2010, 19:55
Любитель, мне это надо чтобы писать плагины на C# для нативной программы.
Все что умеет программа - это грузить .dll, и предоставлять им свое API, которое длл находят сами.

Цитата(Любитель @  25.4.2010,  20:24 Найти цитируемый пост)
прописать в after build степы патчинг сборки (для добавления статик конструктора к <Module>)

Можете показать как и чем это делается?

Автор: Любитель 25.4.2010, 21:00
Цитата(GoldFinch @  25.4.2010,  19:55 Найти цитируемый пост)
Любитель, мне это надо чтобы писать плагины на C# для нативной программы.

Я бы использовал обёртку на C++/CLI для таких целей. Если очень не нравится две длл-ки (обёртка плюс сама реализация) - можно воспользоваться ILMerge.

Что касается прописывания инициализатора модулей - то, если честно, я не уверен вообще будет ли это работать при загрузке из неуправляемого приложения (надо проверять). Если интересно, вот http://tech.einaregilsson.com/2009/12/16/module-initializers-in-csharp/ есть пример кода утилиты-патчера. Сразу замечу, что для модификации сборок там используется библиотека Mono.Cecil (наверно, лучшая для этой задачи).

Автор: A5uKa 26.4.2010, 07:35
http://dranaxum.wordpress.com/2008/02/25/dynamic-load-net-dll-files-creating-a-plug-in-system-c/

?

Автор: GoldFinch 26.4.2010, 08:09
A5uKa, там создается программа которая грузит длл, а мне это не надо, у меня уже есть программа

Автор: Любитель 26.4.2010, 11:08
GoldFinch, что-т такое впечатление, что всё плохо, если твоя длл-ка ничего не должна экспортировать, а только smile
То есть так или иначе рантайм придётся стартовать вручную (либо непосредственно _CorDllMain/_CorExeMain, либо использовать обёртку в виде COM). В C++/CLI в DllMain нельзя с менеджед объектами работать оказывается (ибо CLR позже инициализируется).

Автор: A5uKa 26.4.2010, 11:12
А разве конструктор не вызывается ?

п.с. вообще ничего не понимаю %D

Автор: Любитель 26.4.2010, 14:05
A5uKa, блин, загрузи дотнентую длл через LoadLibrary виндовую. Ничего дотнетного не вызовется.

Автор: A5uKa 26.4.2010, 16:18
Цитата(Любитель @ 26.4.2010,  14:05)
A5uKa, блин, загрузи дотнентую длл через LoadLibrary виндовую. Ничего дотнетного не вызовется.

НЕ ПОНИМАЮ ! Зачем загружать через виндовую ?


ясно  smile  мне почему-то фраза "нативной программы" ничего не сказала  smile 

п.с. а нафиг не использовать .net ?

Автор: Любитель 26.4.2010, 19:38
Цитата(A5uKa @  26.4.2010,  16:18 Найти цитируемый пост)
Зачем загружать через виндовую ?

Цитата(GoldFinch @  25.4.2010,  19:55 Найти цитируемый пост)
мне это надо чтобы писать плагины на C# для нативной программы.


Автор: jonie 27.4.2010, 08:06
С++/CLR заюзать ?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)