只是想知道是否有人能够向我解释JVM,CLR和其他“虚拟机”如何知道何时“开始”?
我的意思是,你双击你的可执行文件,你的机器开始执行代码,但在某些时候 - 显然 - 代码需要通知机器这个代码需要一些其他进程才能运行并需要传入操作码。那么这是怎么发生的?
答案 0 :(得分:4)
每个可执行文件首先运行非托管代码,该代码传递控件,例如到CLR(从mscoree.dll调用_CorExeMain)。然后CLR(非托管的东西)读取/编译/执行程序集内的代码(和其他东西)。
答案 1 :(得分:1)
在.net程序中,可执行文件中有一种启动CLR的引导加载程序。此引导加载程序使用本机机器代码编写,因此可以直接执行。接下来是托管代码和其他应用程序资源,然后由CLR执行.net程序。
看一下JVM,它可能会更清楚。你有几个.class文件传递给java.exe。这些.class文件包含java字节码,无法通过双击直接执行。另外.jar文件只是一个包含.class和其他文件的zip文件。文件扩展名.jar映射到java.exe,当您双击它时,执行java.exe并将.jar文件作为参数执行 - 与双击.doc word文件并启动Word的过程相同。
答案 2 :(得分:-1)
这在一定程度上取决于操作系统。在linux中,你只能通过说java程序的名称来运行Java程序,你通常会使用java。我没有运行任何CLR二进制文件,但我认为它是相同的。在Windows中(以及像Jar文件这样的东西),windows有一个处理程序,它表示“当用户打开以.jar结尾的文件,运行java”时,类似于.net二进制文件。