当前位置: 首页 > 专利查询>微软公司专利>正文

预编译托存托管代码制造技术

技术编号:6948324 阅读:245 留言:0更新日期:2012-04-11 18:40
在此描述托存预编译系统,该托存预编译系统提供了允许提前编译在主机中运行的托管代码的方式。在可获得任何配置设置之后,主机在应用程序运行时触发提前编译。主机可以选择要编译哪些模块、何时编译它们、以及在什么地方持久存储所生成的映像。在检测到模块加载时,主机能够触发预编译,为加载器提供模块现有的预编译映像,或者不做任何事情。运行时环境/平台确认任何主机供应的预编译映像的完整性,并提供应用程序编程接口(API)以便告知主机映像何时变得无效和加载失败。该平台也提供API以便使主机在与主机相关的任何时刻触发对二进制代码的编译,并同步地或在后台进程中生成映像。

【技术实现步骤摘要】

本专利技术涉及预编译系统,尤其涉及用于预编译托存应用程序代码的计算机系统。
技术介绍
许多应用程序和库以诸如MICROSOFT 间语言(MSIL)等的中间格式分发。这些中间语言二进制代码(在MICROSOFT . NET的情况下,也称为托管汇编件)通常在使用即时(JIT)编译器的虚拟机环境中在运行时动态地被编译。动态编译的一种替换方案是经由本机生成(NGen)的预编译。NGen从中间语言生成机器码和运行时数据结构并将它们持久存储在盘上的文件中。由NGen产生的映像被称为本机映像或NGen映像。不同于JIT编译的代码,NGen映像中的代码和数据结构可以跨进程共享。对于通常跨多个进程共享的库和框架,NGen是非常有用的,因为它将每一个托管进程的工作集减到最少。因此,NGen降低了系统的总存储器利用率。NGen在用于使得客户机侧应用程序的启动时间最小化方面也非常有用。若干托管平台/应用程序正在使用NGen。然而,不幸的是,在这些当前的平台中非常难以使用NGen。由于在终端用户机器上创建NGen映像,所以NGen命令通常通过框架/ 应用程序的安装程序来链接。通常,这涉及写入调用命令行工具(在MICROSOFT .NET的情况下是ngen. exe)的定制动作(诸如MIR0S0FT WINDOWS Installer动作)。定制动作不容易编写。此外,NGen映像可能由于各种原因(诸如在对应的库/汇编件被服务/更新时)而变得无效,且需要在每次发生时通过经由命令行工具发出显式命令来重新生成。当代的浏览器和其他应用程序允许通常包括托存软件代码的插件,托存软件代码与主存浏览器/应用程序交互以提供附加功能。使用插件的一种原因是增加安全性;主存浏览器限制托存代码(其通常是不受信任的)可以执行的动作。因特网已经变得非常危险,恶意网站常常尝试引起用户下载和运行可以损坏用户的计算机系统或破坏用户的数据的有害代码。因而,web浏览器常常包括对可以运行的代码的限制,以及可以在用户的计算机系统上执行动作的插件。插件增加了由浏览器提供的沙箱的大小,这是因为它们允许 web上的更多功能,同时降低了所安装的不受信任的应用程序的数量。一个这样的插件是 MICROSOFT SILVERLIGHT ,其提供允许应用程序开发者创建被主存在浏览器中的丰富的 web应用程序的平台,这些web应用程序通常包括动画、向量图形和/或媒体(例如,音频/ 视频)内容播放。另一示例插件是AD0BE FLASH 。虚拟执行环境通常使主机应用程序(主机本身可以以本机或托管代码来编写)定制托存托管代码在其中运行的环境的各方面成为可能。例如,主机可以指定与安全性相关的设置(以便设立沙箱),并记载动态链接库(DLL)(例如,以便指示从哪里加载DLL)。类似 NGen的提前编译器通常不访问这些设置,这是因为作为运行主机应用程序的一部分而生成它们。例如,这些设置在安装时通常不是已知的。当前的解决方案期望开发者运行主机应用程序,记录设置,且然后使得该信息对编译器可用。往往不存在提供此信息的受支持的方式,且即使是存在时,该过程也是手动的和冗长的。因此,托存托管代码通常不是预编译的,这导致经受性能和资源使用率的损失。
技术实现思路
在此描述托存(hosted)预编译系统,该托存预编译系统提供了允许提前编译在主机中运行的托管代码的方式。在可获得任何配置设置之后,主机在应用程序运行时触发提前编译。主机可以选择要编译哪些模块、何时编译它们、以及在什么地方持久存储所生成的映像。这使运行时环境免于推断应用程序设置,调度初始编译工作,以及跟踪何时映像变得无效且需要重新生成。映像在将要使用映像的应用程序的上下文中按需生成和重新生成。托存预编译系统标识应用程序是否在另一主机应用程序中运行,并让主机截取模块加载。在检测到模块加载时,主机能够触发预编译,为加载器提供模块现有的预编译映像,或者不做任何事情。运行时环境/平台确认任何主机供应的预编译映像的完整性,并提供应用程序编程接口(API)以便告知主机映像何时变得无效和加载失败。该平台也提供API以便使主机在与主机相关的任何时刻触发对二进制代码的编译,并同步地或在后台进程中生成映像。由此,托存预编译系统使得对于托存应用程序预编译成为可能。提供本
技术实现思路
以便以简化形式介绍将在以下的具体实施方式中进一步描述的一些概念。本
技术实现思路
并不旨在标识出所要求保护的主题的关键特征或必要特征,也不旨在用于限定所要求保护的主题的范围。附图说明图1是示出一种实施方式中的托存预编译系统的组件的框图。图2是示出一种实施方式中的托存预编译系统加载模块的处理的流程图。图3是示出一种实施方式中的托存预编译系统加载由托存环境使用的模块的处理的流程图。图4是示出一种实施方式中的托存预编译系统执行相关模块的主机发起的重新编译的处理的流程图。具体实施例方式在此描述托存预编译系统,该托存预编译系统提供了允许提前编译在主机中运行的托管代码的方式。在可获得任何配置设置之后,主机在应用程序运行时触发提前编译。 主机可以选择要编译哪些模块(例如,DLL)、何时编译它们、以及在什么地方持久存储所生成的映像。这使运行时环境免于推断应用程序设置,调度初始编译工作,以及跟踪何时映像变得无效且需要重新生成。映像在将要使用映像的应用程序的上下文中按需生成和重新生成。托存预编译系统标识应用程序是否在另一主机应用程序中运行,并让主机截取模块加载。在检测到模块加载时,主机能够触发预编译,为加载器提供模块现有的预编译映像,或者不做任何事情。运行时环境/平台确认任何主机供应的预编译映像的完整性,并提供应用程序编程接口(API)以便告知主机映像何时变得无效和加载失败。该平台也提供API以便使主机在与主机相关的任何时刻触发对二进制代码的编译,并同步地或在后台进程中生成映像。当在另一应用程序主机中运行时,系统可以自动地将托管二进制代码(例如,MSIL、Java字节代码)预编译为机器码。系统给主机应用程序提供对要预编译的二进制代码、要使用的编译策略和存储所生成的映像的位置的完全控制。在所给定的预编译的二进制代码被确定为无效时(例如,因为相应的DLL改变,它们的依赖关系已经被改变,或针对其而构建它们的平台的版本改变),系统与主机通信。系统在运行应用程序的上下文中触发预编译,且由此所生成的映像将在应用程序的上下文中正确地工作。由此,托存预编译系统使得对于托存应用程序预编译成为可能,并通过产生本机映像来允许这样的环境具有与非托存环境不相上下的性能。在托管代码(例如,MSIL或Java字节代码)在另一主机应用程序中运行时,托管运行时环境(例如,MICROSOFT NET公共语言运行时环境(CLR))执行不同的代码路径以加载相关模块(例如,DLL)。作为其确定所给定的模块是否具有有效的预编译形式的逻辑的一部分,运行时加载器使主机应用程序选择从其中加载预编译的二进制的位置。运行时环境确认主机供应的二进制代码并且加载二进制代码并执行代码(照常)或确定二进制代码是无效的并向主机提供回调通知。主机可以监听该回调并使用运行时环境提供的API来触发新的(有效的)预编译的二进制的生成。借助于这样的回调或无需这样的回调,主机可以触发二进本文档来自技高网
...

【技术保护点】
1.一种用于在中间语言中加载模块以供托存环境使用的计算机实现的方法,所述方法包括:接收210模块加载请求;确定220所述模块是否正在托存环境内加载;将在所述托存环境中加载模块的尝试通知310给所述托存环境;接收320用于存储与所述加载模块相关的二进制映像的位置,其中所述位置由所述托存环境管理;确认330在所接收的位置被访问的所存储的二进制映像;当确定340所存储的二进制映像无效时,通知350所述托存环境所存储的二进制映像是无效的;接收360生成所述加载模块的新二进制映像版本的主机请求;将所述新二进制映像存储370在主机所提供的位置;以及使所述映像准备380执行,其中上述步骤由至少一个处理器来执行。

【技术特征摘要】
...

【专利技术属性】
技术研发人员:S·比斯沃斯D·L·德特勒夫斯B·T·福斯托尔R·克里希纳斯瓦米K·B·弗雷
申请(专利权)人:微软公司
类型:发明
国别省市:US

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1