平台调用服务
平台调用服务 / 维基百科,自由的 encyclopedia
平台调用服务(英语:Platform Invocation Services),或称P/Invoke,是微软的公共语言基础设施实现的一个特性,类似于微软的公共语言运行时提供的跨平台调用方式,允许托管代码调用原生代码。
托管代码(例如C#或VB.NET或C++/CLI)提供对.NET Framework的组成库中定义的类、方法和类型的本机访问。虽然.NET Framework提供了一组广泛的功能,但它可能无法访问通常以非托管代码编写的许多较低级别的操作系统库或也以非托管代码编写的第三方库。P/Invoke是程序员可以用来访问这些库中的函数的技术。通过在托管代码中声明非托管函数的签名来调用这些库中的函数,该签名充当可以像任何其他托管方法一样调用的实际函数。该声明引用库的文件路径,并定义托管类型中的函数参数和返回值,这些托管类型最有可能由公共语言运行时(CLR)与非托管类型隐式封送。当非托管数据类型对于从托管类型到托管类型的简单隐式转换来说变得过于复杂时,框架允许用户在函数、返回和/或参数上定义属性,以显式细化数据的编组方式,以免试图隐式地这样做会导致异常。
与使用非托管语言进行编程相比,托管代码程序员可以使用许多低级编程概念的抽象。因此,仅具有托管代码经验的程序员需要温习编程概念,例如指针、结构和引用传递,以克服使用P/Invoke时的一些障碍。
平台调用服务这一特性与微软的公共语言运行时提供的较为类似,因此一般提到P/Invoke多数指微软的.NET实现方案。这一方案能够实现通过托管代码访问原生代码。使用P/Invoke可以通过CLR来控制DLL的加载,以及将非托管代码的数据类型转换为托管数据类型。