使用.Net编程访问Windows Phone设备

Windows Phone SDK提供了使用编程方法访问Windows Phone设备的程序集,以Windows Phone 8.1 SDK为例,它们位于:

%ProgramFiles(x86)%\Microsoft SDKs\Windows Phone\v8.1\Tools\AppDeploy\Microsoft.Phone.Tools.Deploy.dll
%WinDir%\Microsoft.NET\assembly\GAC_MSIL\Microsoft.SmartDevice.Connectivity\v4.0_12.0.0.0__b03f5f7f11d50a3a\Microsoft.Smartdevice.Connectivity.dll
%WinDir%\Microsoft.NET\assembly\GAC_MSIL\Microsoft.SmartDevice.Connectivity.Interface\v4.0_12.0.0.0__b03f5f7f11d50a3a\Microsoft.Smartdevice.Connectivity.Interface.dll
%WinDir%\Microsoft.NET\assembly\GAC_MSIL\Microsoft.SmartDevice.ConnectivityWrapper.10\v4.0_11.0.0.0__b03f5f7f11d50a3a\Microsoft.Smartdevice.ConnectivityWrapper.10.dll
%WinDir%\Microsoft.NET\assembly\GAC_MSIL\Microsoft.SmartDevice.ConnectivityWrapper.11\v4.0_12.0.0.0__b03f5f7f11d50a3a\Microsoft.Smartdevice.ConnectivityWrapper.11.dll
%WinDir%\Microsoft.NET\assembly\GAC_MSIL\Microsoft.SmartDevice.ConnectivityWrapper.12\v4.0_12.0.0.0__b03f5f7f11d50a3a\Microsoft.Smartdevice.ConnectivityWrapper.12.dll
%WinDir%\Microsoft.NET\assembly\GAC_MSIL\Microsoft.SmartDevice.MultiTargeting.Connectivity\v4.0_12.0.0.0__b03f5f7f11d50a3a\Microsoft.Smartdevice.MultiTargeting.Connectivity.dll

为了便于操作,可以同时加入Windows Phone Power Tools第三方工具的WindowsPhone.Tools.dll程序集,您可以在Windows Phone Power Tools的发行版本中找到它。

在项目中参考这些程序集后,引入下面的命名空间:

Imports WindowsPhone.Tools
Imports Microsoft.Phone.Tools.Deploy
Imports Microsoft.SmartDevice.Connectivity
Imports Microsoft.SmartDevice.Connectivity.Interface
Imports Microsoft.SmartDevice.MultiTargeting.Connectivity

随后,即可以编程的形式访问Windows Phone设备。

枚举和连接设备

首先,初始化连接管理器:

Dim PhoneConnectionManager As New MultiTargetingConnectivity(System.Globalization.CultureInfo.CurrentCulture.LCID)

使用MultiTargetingConnectivity.GetConnectableDevices()函数枚举可连接的设备,该函数返回由ConnectableDevice对象组成的集合,反映当前系统上可连接的设备对象:

Public Function EnumerateDevices() As List(Of ConnectableDevice)
    Dim PhoneList As New List(Of ConnectableDevice)
    For Each Phone As ConnectableDevice In PhoneConnectionManager.GetConnectableDevices()
        PhoneList.Add(Phone)
    Next
    Return PhoneList
End Function

ConnectableDevice对象提供了Connect()函数实现设备连接,该函数返回IDevice操作接口,表示已连接到的设备:

Dim CurrentConnectedDevice As IDevice = PhoneList(0).Connect()

此时,应该已经成功连接到了目标设备。

安装应用程序包

您可以通过编程方式向设备部署XAP、AppX或AppXBundle程序包。此处使用字符串变量AppPackagePath表示需要部署的程序包的路径。

安装程序包前,需要先获取该程序包的GUID等数据,可以通过Microsoft.Phone.Tools.Deploy命名空间下的Utils.ReadAppManifestInfoFromPackage()函数获取。对于XAP包,也可以使用Windows Phone Power Tools的WindowsPhone.Tools.dll程序集提供的Xap对象获取,通过该对象获取XAP包的GUID信息可以避免Utils.ReadAppManifestInfoFromPackage()函数在处理部分在包描述文件WMAppManifest.xml中声明了特殊权限的XAP包时遇到的XML错误。

'Parse package info
Dim AppGuid As System.Guid
Dim AppGenre As String
Dim AppIconPath As String
If AppPackagePath.ToUpper.EndsWith(".XAP") Then
    Dim AppManifest As New Xap(AppPackagePath)
    AppGuid = AppManifest.Guid
    AppGenre = "32"
    AppIconPath = AppManifest.Icon
Else
    Dim AppManifest As IAppManifestInfo = Utils.ReadAppManifestInfoFromPackage(AppPackagePath)
    AppGuid = AppManifest.ProductId
    AppGenre = "32"
    AppIconPath = CInt(AppManifest.PackageType).ToString()
End If

若应用程序包在目标设备上已存在,则安装可能失败,因此可以在开始安装前使用IDevice.IsApplicationInstalled()函数,传入程序包的GUID检测应用程序是否存在,并在必要时通过IDevice.GetApplication()获取IRemoteApplication对象,调用Uninstall()方法卸载该应用程序:

'Check if package is already installed
If CurrentConnectedDevice.IsApplicationInstalled(AppGuid) Then
    CurrentConnectedDevice.GetApplication(AppGuid).Uninstall()
End If

随后,即可开始安装应用程序:

'Install package
CurrentConnectedDevice.InstallApplication(AppGuid, _
                                          AppGuid, _
                                          AppGenre, _
                                          AppIconPath, _
                                          AppPackagePath)
除非特别注明,本页内容采用以下授权方式: Creative Commons Attribution-ShareAlike 3.0 License