c# - .net dll 是否有像 c++ dll 中的 dll 那样的入口点

标签 c# c++ .net dll

我真的不确定 .net dll 是否也像 c++ dll 通常具有的那样具有入口点。 我如何查看 .net dll 是否具有入口点。

我在某处读到 WIN32 dll 可以有入口点,而 dot-net 类库没有。

谢谢,

最佳答案

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

这些入口点有助于运行托管程序,而无需显式启动 VM 主机。避免需要 mono.exe 或 java.exe。它们实际上不再用于现代 Windows 版本,操作系统知道包含 .NET list 的可执行文件,加载程序再次将作业传递给加载程序填充程序 mscoree.dll。这种认识对于实现 considerable trick 是必要的从包含 32 位 PE32 header 的 EXE 中建立 64 位进程。 Mscoree.dll 修补内部加载程序数据结构以实现这一壮举。

每个 .NET 程序集还包含一个托管 入口点,列在 list header 中。在加载程序集后由 CLR 立即调用。 EXE 总是有一个,它指向 Main() 方法,编译器确保您不会忘记编写一个。例如,DLL 可能 有一个,混合模式程序集总是有一个。指向 module initializer位于 <Module>类,C++/CLI 编译器使用它来确保在执行任何托管代码之前初始化 CRT(C 运行时库)。

关于c# - .net dll 是否有像 c++ dll 中的 dll 那样的入口点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28512431/

相关文章:

.net - log4net LogicalThreadContext不起作用

c# - 使用 StreamWriter 作为参数之一对 void 方法进行单元测试

c# - 我如何确定与网络服务器的连接是否使用完美前向保密?

c++ - 如何在 C++ 中获取指向 main() 方法的函数指针?

c++ - C++文件中函数错误的多重定义

c++ - 有什么方法可以编译时检查字符串用户定义的文字吗?

c# - 如何访问 ActionExecutingContext 中的 Request.Properties

c# - EF-Core 尝试插入已经存在的关系数据

c# - C#中如何枚举COM对象的成员?

c# - 所有(OOP)依赖项的根存储在哪里?