C # Реализация DllMain с помощью DllExport

#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, никаких проблем. Ваше право, я должен отредактировать вопрос вместо публикации ответа. Спасибо.