我真的不确定.net dll是否也有像c ++ dll一样的入口点。 我怎样才能看到.net dll是否有入口点。
我读到某个地方,WIN32 dll可以有入口点,dot-net类库也不行。
谢谢,
答案 0 :(得分:5)
这是一个不起眼的主题,我将以极快的速度经历它。每个.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位进程的considerable trick是必要的。 Mscoree.dll修补内部加载器数据结构以实现此壮举。
每个.NET程序集还包含一个托管入口点,列在清单标头中。加载程序集后立即由CLR调用。 EXE总是有一个,它指向Main()方法,编译器确保您不会忘记编写一个。 DLL 可能有一个,混合模式程序集总是有一个例如。指向位于<Module>
类中的module initializer,C ++ / CLI编译器使用它来确保在任何托管代码可以执行之前初始化CRT(C运行时库)。
答案 1 :(得分:0)
不,.NET DLL程序集没有DllMain
非托管DLL的方式。但是,在DllMain
中实现的所有行为通常都可以使用各种.NET构造来实现。例如:
IDisposable
界面可以确定清理。实现终结器为您提供了非确定性清理的可能性(但不是保证)(即在对象被垃圾收集之前)AppDomain
包含DomainUnload
和ProcessExit
个事件,可让您在app域或进程关闭时运行清理代码。