> For the complete documentation index, see [llms.txt](https://elguerre.gitbook.io/de0an/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://elguerre.gitbook.io/de0an/capitulo-2-antes-de-comenzar.-el-terreno-de-juego/sdk-de-desarrollo.md).

# API/SDK de desarrollo

En el capítulo 1 ya dijimos que el SDK de Windows 10 o UWP, es un requisito imprescindible para poder desarrollar aplicaciones en Windows 10 como plataforma. Permite crear aplicaciones en código manejado usando **XAML** (*eXtended Application Markup Language*) y C# (CSharp) o VB (Visual Basic).

De la misma manera, C++ aporta una mayor flexibilidad y rendimiento al permitir crear aplicaciones en código nativo. Aunque todas las aplicaciones pueden utilizarlo, no todas lo necesitan. De hecho, dependiendo de la aplicación, se pueden conseguir las mismas características y rendimiento tanto con código nativo como con código manejado. Algunas razones por las que querer desarrollar una aplicación en código nativo, pueden ser: portabilidad, generación de gráficos, juegos 3D y rendimiento.

La siguiente figura ilustra el modelo de ejecución para aplicaciones UWP las cuales comparten un mismo núcleo y son extendidas para cada familia de dispositivos.

![](https://240651724-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FfrvHBNivOTy0fVKROgzo%2Fuploads%2Fgit-blob-9f6f3eaf9f25889268131057a684140f9e04be9e%2Fimage5.png?alt=media)

**Figura 05.- Modelo de ejecución para UWP**

No vamos a entrar en el detalle de cada una de ellas puesto que se trataría de reescribir parte de la MSDN (hoy Microsoft Learn), pero siempre podemos profundizar consultando la página <https://msdn.microsoft.com/library/windows/apps/bg124285.aspx>, donde, podemos encontrarlas agrupadas tal y como se muestra en la siguiente tabla:

**Tabla 05.- Relación de APIs para aplicaciones UWP**

| API                                                       | Descripción                                                                                                                            |
| --------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------- |
| API de Windows en tiempo de ejecución (o Windows Runtime) | APIs para todos los espacios de nombres de Windows en tiempo de ejecución.                                                             |
| Familias de Dispositivos (o Devices families)             | Enumera todas las familias de dispositivos y sus versiones, así como otra información sobre cada familia de dispositivo en particular. |
| Contratos de API (o API Contracts)                        | Listado de todos los contratos de API y sus versiones, profundizando sobre cada una en particular.                                     |
| .NET API                                                  | APIs de .NET que admiten su uso en las aplicaciones para UWP.                                                                          |
| Win32 y COM                                               | Conjunto de API de Win32 y COM admitidas para su uso en aplicaciones UWP.                                                              |
| WinJS API                                                 | APIs de Windows para JavaScript.                                                                                                       |
| Schemas                                                   | Especificaciones del esquema de archivo, URI y XML para aplicaciones UWP.                                                              |
| Visual Basic y C#                                         | Conjunto de características sobre Visual Basic y C#.                                                                                   |
| Visual C++ (C++/CX)                                       | Conjunto de características sobre Visual C++.                                                                                          |
| JavaScript                                                | Conjunto de características sobre JavaScript                                                                                           |

Dentro del grupo “Windows Runtime”, merece especial atención, el namespace “*Windows.Foundation.Metadata*”, concretamente la clase “*ApiInformation*” y el método “*IsTypePresent*”. Por ejemplo, para determinar si el dispositivo en el que se ejecuta la aplicación dispone del botón hardware “Back”, codificaremos lo siguiente:

```
if(ApiInformation.IsTypePresent("Windows.Phone.UI.Input.HardwareButtons"))
{
    HardwareButtons.BackPressed += HardwareButtons_BackPressed;
    HardwareButtons.CameraPressed += HardwareButtons_CameraPressed;
}
```

De igual forma, el método *IsEventPresent* va a permitirnos de una forma mucho más directa hacer cierto tipo de validaciones.

```
if (ApiInformation.IsEventPresent("Windows.Phone.UI.Input.HardwareButtons", "CameraPressed"))
{
    // ...
}
```

Si, además, nos encontramos con un cambio de versión en las APIs, podremos utilizar *IsApiContractPresent*, lo que, sin duda, va a permitirnos trabajar con multitud de ellas y realizar actualizaciones o migraciones de código de una manera mucho más ágil y ordenada.

```
if (ApiInformation.IsApiContractPresent("Windows.Devices.Scanners.ScannerDeviceContract", 1, 0))
{
    // ...
}
```

Gracias a este grupo, nuestra aplicación podrá ejecutarse en cualquier dispositivo independientemente de que éste disponga o no de un componente hardware u otro o ninguno de ellos. Así mismo, va a ser posible conseguir que nuestra interfaz sea mucho más fácilmente adaptativa.
