. net应用程序加载器's命令行解析器

本文关键字:命令行 应用程序 加载 net | 更新日期: 2023-09-27 18:13:25

我最近在研究一个通用解析器,并得到了折叠([...] / {...})管理的点,我有兴趣知道。net args解析器是如何工作的(解析器本质上是在应用程序入口点填充args数组)。

我开始寻找周围的CLR (mscorlib.dll),但没有找到什么是在寻找,所以我的问题是什么机制是用来解析这些参数,如果它是一个CLR类型哪一个它是,或者如果它是一个非托管的p/调用,它被声明。

. net应用程序加载器's命令行解析器

微软最近发布了。net编译器平台的源代码,所以我们可以看一下!

它包含一个类Microsoft.CodeAnalysis.CommandLineParser和一个SplitCommandLineIntoArguments方法,描述如下:

/// <summary>
/// Split a command line by the same rules as Main would get the commands.
/// </summary>
/// <remarks>
/// Rules for command line parsing, according to MSDN:
/// ...
/// </remarks>

这是args解析器的完整c#实现,可以在Apache许可下方便地获得:

  • http://source.roslyn.codeplex.com/Microsoft.CodeAnalysis/移植/命令行/CommonCommandLineParser.cs

这是控制台应用程序main函数内部的调用堆栈:

Program.Main(string[] args = {string[0]}) Line 18 + 0x5 bytes   C#
mscoreei.dll!6f79f5a3()     
mscoree.dll!70bc7f16()  
mscoree.dll!70bc4de3()  
kernel32.dll!76f03677()     
ntdll.dll!77c09d72()    
ntdll.dll!77c09d45()    

至少从本机代码直接调用main(string[])。我仍然不确定解析也发生在本机代码中,也许它是一个托管函数,它在main之前被调用。

. net框架可能调用Windows API。

有函数:GetCommandLine (http://msdn.microsoft.com/en-us/library/ms683156.aspx)和CommandLineToArgvW (http://msdn.microsoft.com/en-us/library/ms647232.aspx)可用于获取和解析命令行