Desensamblando un proyecto Silverlight 2.0 Beta 1
Estoy investigando y jugando un poco con Silverlight 2.0 y se me ha ocurrido desensamblar una aplicación Silverlight 2.0 Beta 1 desde un navegador Web para trastear un poco y ver que como se me daba, y la verdad es que aunque el ejemplo que os traigo es básico, el resultado es el esperado.
Para esta demostración, he iniciado por un lado un nuevo proyecto de nombre SilverlightAppDemo1 con Silverlight 2.0 Beta 1 y he agregado un objeto StackPanel dentro del código XAML. Dentro de este objeto he añadido un objeto hijo de tipo Border, y al mismo tiempo y dentro de este último, un objeto Button.
El código XAML es el siguiente:
<UserControl xClass="SilverlightAppDemo1.Page"
xmlns="http://schemas.microsoft.com/client/2007"
xmlnsx="http://schemas.microsoft.com/winfx/2006/xaml"
Width="400" Height="300">
<Grid xName="LayoutRoot" Background="White">
<StackPanel>
<Border Background="SkyBlue" BorderBrush="Black" BorderThickness="1">
<Button Background="Beige" Content="Aceptar" />
</Border>
</StackPanel>
</Grid>
</UserControl> |
He compilado y he ejecutado la aplicación de demostración y he visto que se ejecuta correctamente.
Si hago clic con el botón derecho del ratón, solo puedo acceder a la opción de Configuración de Silverlight, asi que me he puesto a ver el código fuente de esta página de inicio y he visto en la parte final el siguiente código:
...
$create(Sys.UI.Silverlight.Control, {"source":"ClientBin/SilverlightAppDemo1.xap"}, null, null, $get("Xaml1_parent"));
... |
Así que me he ido directamente a por el fichero SilverlightAppDemo1.xap escibiendo en el navegador Web la dirección http://servidor/aplicación/ClientBin/nombre.xap y lo he guardado en disco.
El fichero xap tiene por objetivo reunir los recursos estáticos de la aplicación (recursos, ensamblados,...).
He abierto el fichero con un editor de hexadecimal y rápidamente he visto que se trataba por la información de cabecera en un fichero .zip.
He renombrado el archivo a .zip y he descomprimido sus elementos:
Con ayuda de .NET Reflector he accedido al ensamblado SilverlightAppDemo1.dll que es el que realmente me interesa, y he podido ver en recursos los dos archivos que agrega al ensamblado:
He guardado en disco page.xaml y he leído su contenido:
<UserControl xClass="SilverlightAppDemo1.Page"
xmlns="http://schemas.microsoft.com/client/2007"
xmlnsx="http://schemas.microsoft.com/winfx/2006/xaml"
Width="400" Height="300">
<Grid xName="LayoutRoot" Background="White">
<StackPanel>
<Border Background="SkyBlue" BorderBrush="Black" BorderThickness="1">
<Button Background="Beige" Content="Aceptar" />
</Border>
</StackPanel>
</Grid>
</UserControl> |
Finalmente y aparte de examinar el código con .NET Reflector, he querido agregar algo de lógica en la página Web inicial:
Aquí va el código XAML final:
<UserControl xClass="SilverlightAppDemo1.Page"
xmlns="http://schemas.microsoft.com/client/2007"
xmlnsx="http://schemas.microsoft.com/winfx/2006/xaml"
Width="400" Height="300">
<Grid xName="LayoutRoot" Background="White">
<StackPanel>
<Border Background="SkyBlue" BorderBrush="Black" BorderThickness="1">
<Button xName="btnAceptar" Background="Beige" Content="Aceptar" Click="btnAceptar_Click" />
</Border>
</StackPanel>
</Grid>
</UserControl> |
Una vez agregado el código XAML, pasaremos a escribir la lógica del código de este formulario y que tiene relación directa con el evento btnAceptar_Click.
El código es el siguiente:
Partial Public Class Page
Inherits UserControl
Public Sub New()
InitializeComponent()
End Sub
Private Sub btnAceptar_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
Me.btnAceptar.Content = "Botón pulsado"
End Sub
End Class |
Ejecutaremos nuestra aplicación y repetiremos los mismos pasos con .NET Reflector que hemos hecho anteriormente.
Observaremos que además del código XAML, somos capaces de obtener el código correspondiente con la lógica de programación del formulario y que está relacionado en concreto con el código del control Button:
Private Sub btnAceptar_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
Me.btnAceptar.Content = "Bot" & ChrW(243) & "n pulsado"
End Sub |
Internamente, Silverlight traduce los caracteres especiales a caracteres HTML para que no haya problemas en la presentación de ñ, tildes, y otros caracteres especiales.
Recordar únicamente, que un fichero de extensión .xap contiene un manifiesto de la aplicación (AppManifest.xaml), y los ficheros dll necesarios para ejecutar la aplicación. La dll principal es la de la aplicación (SilverlightAppDemo1.dll en mi caso) y las librerías o ensamblados asociados o dependientes de la aplicación (System.Windows.Controls.dll y System.Windows.Controls.Extended.dll).
Examinando el manifiesto de la aplicación, observaremos que este contiene la definición de la aplicación y sus partes o ensamblados necesarios.
<Deployment xmlns="http://schemas.microsoft.com/client/2007/deployment" xmlnsx="http://schemas.microsoft.com/winfx/2006/xaml" EntryPointAssembly="SilverlightAppDemo1" EntryPointType="SilverlightAppDemo1.App" RuntimeVersion="2.0.30226.2">
<DeploymentParts>
<AssemblyPart xName="SilverlightAppDemo1" Source="SilverlightAppDemo1.dll" />
<AssemblyPart xName="System.Windows.Controls" Source="System.Windows.Controls.dll" />
<AssemblyPart xName="System.Windows.Controls.Extended" Source="System.Windows.Controls.Extended.dll" />
</DeploymentParts>
</Deployment> |
No es mucho pero es una curisodad que espero ayude a entender como despliega Silverlight 2.0 Beta 1 una aplicación y que partes tiene o puede tener un ensamblado dentro así como el contenido real del fichero .xap.