【问题标题】:C# Implementing DllMain with DllExportC# 使用 DllExport 实现 DllMain
【发布时间】:2016-10-08 13:36:40
【问题描述】:

我正在使用 UnmanagedExports 作者 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,但没有任何反应。有什么解决办法吗?

【问题讨论】:

  • 这个非托管导出:nuget.org/packages/UnmanagedExports?
  • 这是不可能的。 Giesecke 的实用程序提供导出。 DllMain() 未导出,它是 DLL 的 入口点。无法修改托管程序集的入口点,它已被使用。它调用 _CorDllMain(),CLR 需要该调用。您需要使用 C++/CLI 来执行此操作。或者一个模块初始化器,在 C# 中不支持,但可以用螺栓固定。
  • @Theraot,你好。
  • @moien 我认为 UnmanagedExport 现在没有解决方案。他们有未解决的问题Can i export a method just called 'DllMain'? - 另见Difference between DllMain and DllEntryPoint。编辑:我不知道允许这样做的替代方案。
  • @Theraot,感谢您的信息

标签: c# dllexport dllmain


【解决方案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(Only one time) 下一次调用 AddFunc

DLL_PROCESS_DETACH 还是一样?

【讨论】:

  • 嗯,从哪里开始? (1.) 您没有提及您用于 DllExport 功能的第 3 方库。 (2.) 但你实际上并不需要它; .NET 将始终确保您的 type initializer 方法 (static Class1() { }) 在类的任何其他静态或实例方法之前被调用。 (3.) 所以你还没有解决 OP 的问题,因为你仍然需要一些外部方主动调用Class1 中的(任何)方法,而不是作为DllMain 的直接结果以某种方式获得控制权。例如,如果您有另一个static Class2,那么...
  • ...该活动将导致您的DllMain 在没有“唤醒”或对Class1 产生任何影响的情况下输入,更不用说显示您的“DLL MAIN...”信息。事实上,在很久很久以前调用DllMain,但从未调用过你的Class1 type-in​​itializer 之后,进程进行非异常退出是完全合法的。
  • @GlennSlayden,在问题的开头,我写了“我正在使用 RobertGiesecke 的 UnmanagedExports”,我接受了自己的答案吗?这意味着问题仍然存在。
  • 好的,抱歉,我没有看到您在回答自己的问题。也许下一次,如果您有更多信息要提供,请考虑编辑原始问题,以便所有人都清楚该主题仍未得到解答。
  • @GlennSlayden,没问题。你的权利,我必须编辑问题而不是发布答案。谢谢。
猜你喜欢
  • 2018-08-05
  • 2021-08-30
  • 2015-06-11
  • 1970-01-01
  • 1970-01-01
  • 2012-03-01
  • 2020-01-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多