| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > .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>). |
| Автор: Любитель 25.4.2010, 21:00 | ||
Я бы использовал обёртку на 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, что-т такое впечатление, что всё плохо, если твоя длл-ка ничего не должна экспортировать, а только То есть так или иначе рантайм придётся стартовать вручную (либо непосредственно _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 | ||
НЕ ПОНИМАЮ ! Зачем загружать через виндовую ? ясно п.с. а нафиг не использовать .net ? |
| Автор: Любитель 26.4.2010, 19:38 | ||
|
| Автор: jonie 27.4.2010, 08:06 |
| С++/CLR заюзать ? |