Desensamblando un proyecto Silverlight 2.0 Beta 1 - Jorge Serrano - MVP Visual Developer - Visual Basic

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 x:Class="SilverlightAppDemo1.Page"
    xmlns="http://schemas.microsoft.com/client/2007"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Width="400" Height="300">
    <Grid x:Name="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:

  • AppManifest.xaml
  • SilverlightAppDemo1.dll
  • System.Windows.Controls.dll
  • System.Windows.Controls.Extended.dll

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:

  • page.xaml
  • app.xaml

He guardado en disco page.xaml y he leído su contenido:

<UserControl x:Class="SilverlightAppDemo1.Page"
    xmlns="http://schemas.microsoft.com/client/2007"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Width="400" Height="300">
    <Grid x:Name="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 x:Class="SilverlightAppDemo1.Page"
    xmlns="http://schemas.microsoft.com/client/2007"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Width="400" Height="300">
    <Grid x:Name="LayoutRoot" Background="White">
        <StackPanel>
            <Border Background="SkyBlue" BorderBrush="Black" BorderThickness="1">
                <Button x:Name="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" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" EntryPointAssembly="SilverlightAppDemo1" 
EntryPointType="SilverlightAppDemo1.App" RuntimeVersion="2.0.30226.2">
  <Deployment.Parts>
    <AssemblyPart x:Name="SilverlightAppDemo1" Source="SilverlightAppDemo1.dll" />
    <AssemblyPart x:Name="System.Windows.Controls" Source="System.Windows.Controls.dll" />
    <AssemblyPart x:Name="System.Windows.Controls.Extended" 
    Source="System.Windows.Controls.Extended.dll" />
  </Deployment.Parts>
</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.

Published 13/3/2008 16:00 por Jorge Serrano
Comparte este post:

Comentarios

Thursday, March 13, 2008 4:25 PM por Lluis Franco

# re: Desensamblando un proyecto Silverlight 2.0 Beta 1

:-)

Jorge, ¿tu duermes?

(Es broma). Chulo el post... :-D

Friday, March 14, 2008 2:53 PM por Javier Suárez

# re: Desensamblando un proyecto Silverlight 2.0 Beta 1

Jorge, "de mayor" (ya tengo 37 tacos) quiero ser como tú.

Muchas Gracias por compartir tu sabiduría.

Friday, March 14, 2008 6:06 PM por dvilchez.net » Blog Archive » Algunos links

# dvilchez.net &raquo; Blog Archive &raquo; Algunos links

PingBack desde  dvilchez.net  &raquo; Blog Archive   &raquo; Algunos links

Friday, March 14, 2008 10:27 PM por Francisco J

# re: Desensamblando un proyecto Silverlight 2.0 Beta 1

Hola Jorge, supongo que debería incluirlo aquí aunque la verdad no sé si tendrá que ver mucho pero ahí va.

Hace unos días instalé el Visual Studio 2008 Pro tras desinstalar la versión 2005 del mismo producto.

Cual es mi sorpresa actualmente que me ocurren los siguientes errores:

1. Cuando hago una actualización de la v.2005 a la 2008 de mis proyectos para leerlos con vs2008, la pantalla no me sale completa, sino que sólo salen los botones, el resto de comentarios y demás sale en el color de fondo pero sin contenido es decir, no sé realmente qué pasos estoy siguiendo.

2. En cuanto a los controles, cuando los arrastro al form no puedo seguir las guías porque no aparecen y a veces cuando arrastro no sé donde está situado hasta que hago un mouseup (suelto el botón del ratón).

3. También ocurre algo similar en las propiedades de los controles, por ej. cuando voy a cambiar el color de fondo o el de la fuente me salen los colores pero no el texto asociado en el panel de herramientas.

Si sigo encontrando algunos problemas los notifico por si alguien sabe de dicho error o es fruto de haber actualizado algo.

Saludos.

Francisco J.

Saturday, March 15, 2008 12:42 AM por FEFE

# re: Desensamblando un proyecto Silverlight 2.0 Beta 1

Una informacion valiosa dificil de encontrar cuando la necesitas.

Gracias Jorge.

PD: ¿De donde sacas tanta paciencia para averiguar estas cosas?

Thursday, October 01, 2009 6:32 PM por cary

# re: Desensamblando un proyecto Silverlight 2.0 Beta 1

hola mira tengo que hacer en silverlight la funcion de descomprimir un archivo. zip

es decir  hago que cargue y lea el archivo bueno lo gaurda pero tengo ue hacer que al guardarlo lo descomprima tambien como le hago podrian ayudarme gracias