• 前言

     Windows Phone 8 SDK中一个非常有用的特性,就是可以通过Windows Phone Runtime Component (WinPRT)使用C++代码来处理运算量大的任务。这样一来Windows Phone应用的性能会得到相应的提升,而且增加了代码的可移植性,有些使用C++写的类库也可以直接调用。WinPRT在内部封装了原生的C++代码,只暴露了用于WinRT类型的接口,从而在C#代码中方便的调用native code。WinPRT是C#代码到C++代码的中间层,调用顺序是C#->(C++/CX)->C++。C++/CX是C++代码的扩展(Visual C++ component extensions),使用C++/CX编写WinPRT来和Visual C#交互。下面就来看看WinPRT的具体使用过程。

首先添加一个WinPRT项目。

添加一个Test类,打开TestComponent.h文件添加如下的代码。

#pragma once

namespace TestComponent
{
public ref class Test sealed
{
public:
bool IsTest();
};
}

这里我们创建了一个可以在其他语言环境下实例化的活跃类,通常被称为ref class。一个WinPRT可以包含多个活跃的公共类,在C#中可以通过new关键字来创建该组件下类的实例。一个活跃类必须被声明为public ref class sealed。ref关键字告诉编译器,我们正在创建一个WinPRT类型的类,sealed关键字代表该类是不可以被继承的。

打开TestComponent.cpp类,添加头文件中方法的实现。

#include "pch.h"
#include "TestComponent.h" using namespace TestComponent; bool Test::IsTest()
{
return true;
}

在其他项目中添加以上WinPRT的引用后就可以在托管代码中使用了。

private void Button_Click(object sender, RoutedEventArgs e)
{
var test = new TestComponent.Test();
var result = test.IsTest();
//
}
  • 总结

上面只给出了一个非常简单的例子来描述WinPRT的使用过程,在我们具体的使用过程中会遇到很多参数类型转换的问题,即把C#类型的数据转换成在C++/CX中正确的类型。

Refernce:

Native code for Windows Phone 8

Visual C++ Language Reference (C++/CX)

Windows Phone Natives - How to Leverage Native Code on Windows Phone