加载和执行用户代码
之所以要编写宿主,是为了设置用于运行托管用户代码的应用程序环境。 在此上下文中,用户代码是指任何不专门属于宿主一部分的托管代码。 例如,对于 Internet Explorer 宿主,用户代码是组成 HTML 页的托管控件和脚本。 对于应用程序服务器宿主,用户代码是包含应用程序服务器所管理和执行的企业业务规则的代码。
所有托管代码都是 Assembly 类的一部分。 因此,可用来加载和运行托管代码的方法都基于程序集。 例如,System.AppDomain 和 System.Reflection.Assembly 类包含使宿主能够加载程序集的方法。 Load 方法具有各种形式:有些方法采用程序集名称,有些方法采用程序集清单所在文件的完整文件系统路径。 这些方法用于加载先前已创建并保存到磁盘上的程序集。
例如,假设上述应用程序服务器宿主允许用户编写托管代码业务规则,以加载到应用程序服务器进程中运行。 当对特定业务规则运行方法的请求发送到应用程序服务器中时,服务器运行时承载代码将确定在哪一个域中运行代码,或者是否必须新建域。 然后,运行时承载代码使用一种程序集 Load 方法来加载包含业务规则的程序集,并使用反射来执行该业务规则上的方法。 有关更多信息,请参见 System.Reflection 命名空间的文档。
System.Reflection.Emit 命名空间还提供了用于动态创建程序集的类型。 当应用程序处理脚本代码时,将以这种方法加载程序集。
例如,字处理程序可能支持用户可用来自定义应用程序行为的宏语言。 在加载运行时并创建应用程序域以后,字处理程序可能会将宏脚本编译为托管代码并使用 System.Reflection.Emit 创建程序集。 然后,可以将创建的程序集加载到应用程序域中并运行。 根据具体的情况,程序集可能仅存在于应用程序的生存期中(即从不保存到磁盘中)。