.net dll在c ++ dll中有一个像dll这样的入口点

我真的不确定.net dll是否也有像c ++ dll一样的入口点。 我怎么知道.net dll是否有入口点。

我在某地读到WIN32 dll可以有入口点,dot-net类库也不行。

谢谢,

这是一个不起眼的主题,我将以极快的速度经历它。 每个.NET程序集都有一个非托管入口点,5个字节的机器代码(如果为x64构建,则为9个字节),用作PE32可执行文件头中标记的入口点。 除了JMP指令外,EXE跳转到_CorExeMain()并且DLL跳转到_CorDllMain() 。 这些函数位于mscoree.dll中,并确保加载并初始化CLR,以便它可以执行托管代码。

这些入口点有助于运行托管程序,而无需显式启动VM主机。 避免使用mono.exe或java.exe。 它们实际上不再用于现代Windows版本,操作系统知道包含.NET清单的可执行文件,并且加载程序将作业再次传递给加载程序Shim,mscoree.dll。 这种认识对于实现从包含32位PE32头的EXE中架设64位进程的相当大的技巧是必要的。 Mscoree.dll修补内部加载器数据结构来完成此壮举。

每个.NET程序集还包含一个托管入口点,列在清单标头中。 加载程序集后立即由CLR调用。 EXE总是有一个,它指向Main()方法,编译器确保你不会忘记写一个。 DLL 可能有一个,混合模式程序集总是有一个。 指向位于类中的模块初始值设定项,C ++ / CLI编译器使用它来确保在任何托管代码可以执行之前初始化CRT(C运行时库)。

不,.NET DLL程序集没有像非托管DLL那样的DllMain 。 但是,在DllMain实现的所有行为通常可以使用各种.NET构造来实现。 例如:

  • 类静态构造函数使您有机会在使用类型之前初始化静态成员
  • 实例初始化(构造函数,字段初始值设定项)允许您在使用实例之前初始化实例数据
  • 实现IDisposable接口可以为您提供确定性清理。 实现终结器为您提供了非确定性清理的可能性(但不是保证)(即在对象被垃圾收集之前)
  • AppDomain具有DomainUnloadProcessExit事件,可以在应用程序域或进程关闭时为您提供运行清理代码的机会。