#c# #dllexport #dllmain
#c# #dllexport #dllmain
Вопрос:
Я использую неуправляемый экспорт от RobertGiesecke
Я хочу экспортировать точку входа DllMain.
Вот что я пробовал
[DllExport("DllMain", CallingConvention.StdCall)]
public static bool DllMain(IntPtr hModule, uint dwReason, byte[] lpReserved)
{
// I Write a text to file here
return true;
}
Затем я вызываю LoadLibrary, но ничего не происходит. Есть решение?
Комментарии:
1. Этот неуправляемый экспорт: nuget.org/packages/UnmanagedExports ?
2. Это невозможно. Утилита Giesecke обеспечивает экспорт. DllMain() не экспортируется, это точка входа для библиотеки DLL. Изменение точки входа для управляемой сборки невозможно, она уже используется. Он вызывает _CorDllMain(), среда CLR требует этого вызова. Для этого вам нужно будет использовать C / CLI. Или инициализатор модуля, не поддерживаемый в C #, но может быть подключен.
3. @Theraot, привет, да.
4. @moien Я не думаю, что сейчас есть решение с неуправляемым экспортом. У них есть открытый вопрос, могу ли я экспортировать метод, который называется просто ‘DllMain’? — смотрите также Разницу между DllMain и DllEntryPoint . Редактировать: я не знаю альтернатив, которые позволяют это.
5. @Theraot, спасибо за информацию
Ответ №1:
Ура, я нашел способ, используя статический конструктор.
Просто создайте класс, содержащий статический экспорт, и добавьте статический метод.
public static class Class1
{
static Class1()
{
Console.WriteLine("DLL MAIN (Only DLL_PROCESS_ATTACH) :D");
}
[DllExport("AddFunc", CallingConvention.Cdecl)]
public static int AddFunc(int a, int b)
{
return a b 1;
}
}
При вызове addFunc программа сначала вызывает Class1(только один раз), затем вызывает addFunc
В любом случае для DLL_PROCESS_DETACH ?
Комментарии:
1. Хм, с чего начать? (1.) Вы ничего не упомянули о сторонней библиотеке, которую вы используете для этой
DllExport
функции. (2.) Но на самом деле вам это все равно не нужно; .NET всегда гарантирует, что ваш метод инициализатора типа (static Class1() { }
) вызывается перед любым другим статическим методом или методом экземпляра класса. (3.) Итак, вы не решили проблему OP, потому что вам все еще требуется, чтобы какая-то внешняя сторона активно вызывала (любой) методClass1
, в отличие от того, чтобы каким-то образом получить контроль как прямое следствиеDllMain
. Например, если у вас есть другойstatic Class2
, то…2. … это действие приведет
DllMain
к тому, что вы будете введены без «пробуждения» или вообще окажете какое-либо влияниеClass1
, не говоря уже о отображении вашего сообщения «DLL MAIN …». На самом деле, для процесса вполне законно выполнить ненормальный выход после того, как он был вызванDllMain
давным-давно, и при этом никогда не вызывал вашClass1
инициализатор типа.3. @GlennSlayden, в начале вопроса я написал «Я использую UnmanagedExports от RobertGiesecke» и принял ли я свой собственный ответ? Это означает, что проблема все еще остается.
4. Хорошо, извините, я не видел, что вы отвечали на свой собственный вопрос. Возможно, в следующий раз, если у вас будет больше информации, рассмотрите возможность редактирования исходного вопроса, чтобы всем было ясно, что тема остается без ответа.
5. @GlennSlayden, никаких проблем. Ваше право, я должен отредактировать вопрос вместо публикации ответа. Спасибо.