• 其他语言



使用微软和英特尔技术构建分布式丰富媒体应用
页面和feed选项
打印
收藏此页
Digg此页 | 添加到您的del.icio.us帐号
目录

示例 2—使用.NET和英特尔® IPP 联结受控代码和非受控代码
展示这些组合资源优势的另一种方式是,说明如何轻松将其他两种技术(即 .NET 和英特尔 IPP)集成到我们的视频应用示例中。

Microsoft .NET Framework 提供受控运行时环境,用于开发面向公共语言运行时(CLR)层的应用。该层包含各种运行时执行服务,例如旨在清理内存的垃圾收集、远程处理、安全服务等,以便快速开发各种类型的软件应用,例如 ASP.NET、Windows Forms、XML Web Service、分布式应用、媒体应用以及各种图像应用等。

只要任一语言具有兼容 .NET 的编译器,能够将源代码编译成 .NET 程序集,就可使用该语言编写受控应用。兼容 .NET 的编译器必须符合公共语言规范(CLS)和公共类型系统(CTS),它们分别是各种语言的公共功能与类型的子集。这些规范支持类型安全和跨语言互操作性,这表明,以兼容 .NET 语言(例如 VB.NET)编写的对象可以在以其他兼容 .NET 的语言(例如 C#)编写的对象中调用。

通过 .NET 的系统运行时 InteropServices 命名空间中支持的互操作性服务,Microsoft .NET 支持受控代码和现有非受控代码之间的通信。

受控代码是使用兼容 .NET framework 的编译器编译源代码创建 .NET 受控程序集时创建的一个映像。.NET 受控程序集可以是 DLL 或可移植的执行体(PE)文件。受控 DLL 或 PE 文件中包含微软中间语言(MSIL)代码和元数据。元数据是 CLR 所使用的信息,用于确保代码执行时的安全性、类型安全和内存安全。受控代码紧密绑定于 CLR 所提供的执行服务,并向程序员展现各种功能,以快速开发强壮且可扩展的应用。

非受控代码是使用本机编译器编译源代码创建用于基础微处理器的本地二进制时创建的映像。该代码不使用 CLR 提供的任何服务,尽管受控代码和非受控代码可以一起运行于同一个受控运行时环境。英特尔® IPP API 是“C”样式受控代码的示例。

下表显示了 .NET Framework 应用中使用的受控代码如何通过 CLR 层工作,以及如何直接调用英特尔® IPP 非受控代码“C”程序库。

.NET Framework 和英特尔® IPP 库


使用平台调用(P/Invoke)

平台调用服务通常称作 P/Invoke,允许受控代码调用 DLL 中的 C 样式受控代码函数。P/Invoke 可以用于任何兼容 .NET 的语言。要熟练使用 P/Invoke,您需要花费些时间和精力。因此,熟悉 DllImportAttribute、MarshalAsAttribute、StructLayoutAttribute 及其枚举用法是很重要的。为获得更高的可用性,建议将常用的英特尔® IPP 函数或一组逻辑函数组合成一个类。类中的每个函数均应声明为外部静态函数。如果可以将各组数据组合起来,以整体形式执行一个 IPP API 调用,这与分别使用各组数据来调用 IPP API 相比,可获得更好的性能。

在受控代码中 P/Invoke 调用来调用非受控 DLL 中的非受控函数时,P/Invoke 服务采取的步骤如下:

  1. P/Invoke 通过在工作目录中或 PATH 变量所指定的目录和子目录中进行搜索,找到 DllImportAttribute 指定的 DLL,然后将该 DLL 加载到进程内存中。
  2. P/Invoke 在加载到内存的 DLL 中查找静态函数。
  3. P/Invoke 通过使用 MarshalAsAttribute 和 StructLayoutAttribute 执行排列整理(如果需要),将参数推入堆栈。
  4. P/Invoke 启用优先式垃圾收集。
  5. 然后,P/Invoke 将控制权转交给静态非受控函数,并向它传递任意数据和指针。


例如:

DllImportAttribute 用于调用 DLL 中的非受控 C 样式 IPP 函数 [DllImport("ipps20.dll", EntryPoint="ippsCopy_16s")] unsafe public static extern IppStatus ippsCopy_16s (short *pSrc, short *pDst, int len);

下面给出一个代码示例:
上一部分1  2  3  4  5  下一部分

第 3 页, 共 6 页