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

时间:2015-02-14 04:28:55

标签: c# c++ .net dll

我真的不确定.net dll是否也有像c ++ dll一样的入口点。 我怎样才能看到.net dll是否有入口点。

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

谢谢,

2 个答案:

答案 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包含DomainUnloadProcessExit个事件,可让您在app域或进程关闭时运行清理代码。