Los Windows Runtime Components

Hace tiempo descubrí (en MVA) los Runtime Components, estos funcionan como librerías que nos permiten compartir código de distintos lenguajes dentro de una misma plataforma. Es decir, podemos usar código escrito en Visual Basic dentro de una aplicación hecha con C#, o un caso más extremo, y el que más me "impresionó": usar C++ en una aplicación hecha con Javascript. Y digo dentro de una misma plataforma ya que al contrario de las PCL, en este caso solo pueden funcionar para un solo sistema.

Lo que se genera junto con este tipo de proyectos son los metadatos para hacer nuestro código accesibles desde cualquier otro proyecto que haga referencia a él, de tal manera que si creamos un componente en C# desde C++ lo podamos llamar sin escribir ni una sola línea más de código y con la sintaxis del lenguaje desde el que estemos llamándolo.

En este caso me referiré a Windows 8, sin embargo me parece que también existen para Windows Phone 8. El ejemplo es bastante sencillo se trata de un método para realizar una suma, sin embargo es bastante extendible y muy funcional cuando se sabe como usarlos. Desde luego, tiene sus resticciones, pero siempre hay alguna forma de darles la vuelta o encontrar una mejor manera de hacerlo (¡por algo son restricciones!)

De tal manera que podríamos tener el siguiente código en C++:

Suma.h
#pragma once

namespace BlogPost_Component
{
    public ref class Suma sealed
    {
    public:
  // Propiedades
  int a;
  int b;
  // Métodos
  int Resultado();
  // Constructores
  Suma(int x, int y);

    };
}

Suma.cpp
// Suma.cpp
#include "pch.h"
#include "Suma.h"

using namespace BlogPost_Component;
using namespace Platform;

Suma::Suma(int x, int y)
{
 this->a = x;
 this->b = y;
}

int Suma::Resultado(){
 return a + b;
}

De tal modo que podemos usar la clase desde C# de esta manera:
private void Button_Click(object sender, RoutedEventArgs e)
{
 int n1 = int.Parse(numero1.Text);
 int n2 = int.Parse(numero2.Text);

 var suma = new BlogPost_Component.Suma(n1,n2);

 resultado.Text = suma.Resultado().ToString();
}

En JavaScript así:
function accionBoton(sender) {
 var n1 = parseInt(document.getElementById('numero1').value);
 var n2 = parseInt(document.getElementById('numero2').value);

 var suma = new BlogPost_Component.Suma(n1, n2);

 document.getElementById('resultado').textContent = suma.resultado();
};
Y en Visual Basic así:
Private Sub Button_Click(sender As Object, e As RoutedEventArgs)
 Dim n1 As Integer = Integer.Parse(numero1.Text)
 Dim n2 As Integer = Integer.Parse(numero2.Text)

 Dim suma As New BlogPost_Component.Suma(n1, n2)

 resultado.Text = suma.Resultado().ToString()
End Sub

El código del ejemplo anterior puede ser descargado aquí.

Como hobbie me puse a convertir el proyecto de la Codificación de Huffman a una aplicación para Windows 8 (escrita en JavaScript con el código de la codificación en C++), hasta el momento me he encontrado con algunas dificultades relacionadas con el acceso a archivos desde aplicaciones Metro, como sea, el proyecto está en GitHub.

PD: Lamento mencionarlo hasta ahora, pero solo es posible crear los componentes en C#, C++ y Visual Basic, lo sentimos, JavaScript.

¡Saludos!
@fferegrino :)