Carregando Dll de um Usercontrol dinamicamente

Neste artigo será mostrado como carregar uma dll de usercontrol dinamicamente em Silverlight. Pois bem, o motivo que me inspirou a fazer este exemplo foi um amigo meu do MSN que insistiu para ajudá-lo a carregar animações dinâmicas vindo externamente. Além disso, percebi um big fator, às vezes podemos ter uma aplicação grande, e como sabemos, o Silverlight cria o arquivo XAP, que é um Zip disfarçado, e fazemos o download deste santo arquivo. Neste ponto, você pode imaginar que, se seu arquivo Xap for grande o usuário irá ficar extremamente zangado e desistir de ver sua aplicação, não é mesmo?. Então o que devemos fazer ?

                Simplesmente devemos é quebrar nossa aplicação em partes, ou seja, criar class Library e usar algumas classes importantes para isso.  Vamos ver então:

 

Passo 1.

 

                Crie uma class Library, indo em VS: File -> New->Project. Em Project types escolha silverlight e em Templates Silverlight Class Library. Forneça um nome, tal como: Bola e pressione ok.

                Na solution Explorer, botão direito e adicione um novo item, selecione Silverlight User Control, forneça o nome de Bola.Xaml  e pressione Ok.   

                Para este demo eu criei uma animação, e chamei no meu construtor, como segue:

 

 

 

 

<UserControl x:Class=”Bola.Bola”

    xmlns=”http://schemas.microsoft.com/winfx/2006/xaml/presentation”

    xmlns:x=”http://schemas.microsoft.com/winfx/2006/xaml”

    Width=”400″ Height=”300″>

                <UserControl.Resources>

                               <Storyboard x:Name=”SbBola”>

                                               <DoubleAnimationUsingKeyFrames BeginTime=”00:00:00 Storyboard.TargetName=”ellipse” Storyboard.TargetProperty=”(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)”>

                                                               <SplineDoubleKeyFrame KeyTime=”00:00:01.2000000″ Value=”64″/>

                                               </DoubleAnimationUsingKeyFrames>

                                               <DoubleAnimationUsingKeyFrames BeginTime=”00:00:00 Storyboard.TargetName=”ellipse” Storyboard.TargetProperty=”(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.Y)”>

                                                               <SplineDoubleKeyFrame KeyTime=”00:00:01.2000000″ Value=”160″/>

                                               </DoubleAnimationUsingKeyFrames>

                               </Storyboard>

                </UserControl.Resources>

    <Grid x:Name=”LayoutRoot” Background=”White”>

                <Ellipse Height=”80″ HorizontalAlignment=”Left” Margin=”24,48,0,0″ VerticalAlignment=”Top” Width=”80″ Fill=”#FF9B2B2B” Stroke=”#FF000000″ RenderTransformOrigin=”0.5,0.5″ x:Name=”ellipse”>

                               <Ellipse.RenderTransform>

                                               <TransformGroup>

                                                               <ScaleTransform/>

                                                               <SkewTransform/>

                                                               <RotateTransform/>

                                                               <TranslateTransform/>

                                               </TransformGroup>

                               </Ellipse.RenderTransform>

                </Ellipse>

 

    </Grid>

</UserControl>

 

Na parte do CodeBehind :

namespace Bola

{

    public partial class Bola : UserControl

    {

        public Bola()

        {

            InitializeComponent();

            SbBola.Begin();

        }

    }

}

 

Bem até ai nada demais. 

 

Agora compile para gerar a dll.

 

Passo 2

Agora, o que precisamos fazer é criar um projeto Silverlight e adicionar a dll, tal como “Bola.dll” dentro da Aplicação Asp.Net, conforme Figura 1. Eu forneci o nome para o meu projeto de LoadAnimation. 

 

Passo 3

 

 

O código seguinte mostra como carregar e mostrar o controle silverlight, ou seja, a dll.

           

Algumas explicações do código:

 

  • Adicione o seguinte namespace, using System.Reflection, que irá permitir pegar o Assembly do objeto.
  • Usar WebClient  para abrir uma leitura assíncrona da dll.
  • Pegar o caminho absoluto da dll.
  • Quando o download é terminado, o assembly é carregado e uma instancia do controle é criada.
  • Finalmente, é adicionado dentro do Layoutroot.

[Code] 

 namespace LoadAnimation

{

    public partial class Page : UserControl

    {

       

        //assembly para ler a dll

 

        private Assembly _assembly;

        public Page()

        {

            InitializeComponent();

            Load();

        }

 

        private void Load()

        {

            //puxar o arquivo da Aplicacao Asp.Net, precisa ser assincrono

 

            WebClient down = new WebClient();

            down.OpenReadCompleted += new OpenReadCompletedEventHandler(download_OpenReadCompleted);

            string classe = “Bola.dll”;

            string absoluteUri = System.Windows.Application.Current.Host.Source.AbsoluteUri;

            string caminho = absoluteUri.Substring(0, absoluteUri.IndexOf(“ClientBin”)) + classe;

 

            //assincrono

            down.OpenReadAsync(new Uri(caminho, UriKind.Absolute));

        }

 

        //Ao terminar de ler é carregada na aplicacao

        void download_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)

        {

            AssemblyPart assemblyPart = new AssemblyPart();

            _assembly = assemblyPart.Load(e.Result);

         

            //Bola.Bola, esta é minha classe

            UserControl control = (UserControl)_assembly.CreateInstance(“Bola.Bola”);

     

            LayoutRoot.Children.Add(control);

        

        }

    }

}

 

 

 

 

Muito obrigada,

Flávia Moreira

 

 

 

2 Respostas para “Carregando Dll de um Usercontrol dinamicamente”


  1. 1 Paulo Eduardo Março 10, 2009 às 6:44 pm

    Oi Flávia,

    Há alguns meses estou me dedicando com minha equipe a entender o mundo silverlight, e gostaria de parabenizá-la por seus artigos.

    Hoje separei algumas de minhas anotações para lhe enviar, mas não achei um link em que eu pudesse fazê-lo, seria legal você colocar um link de contato, ou me enviar um email… claro isso se você tiver interesse…

    Abraços,
    Paulo Eduardo

    • 2 Flavia Moreira Março 10, 2009 às 9:35 pm

      Olá Paulo.

      Obrigada primeiramente pelo comentário.

      Bem, eu enviei um e-mail para você também com o meu e-mail, bem eu não coloquei um link no meu
      blog, pois, eu sempre respondo as perguntas que as pessoas fazem para mim no
      proprio blog e sempre, sempre retorno as mensagens por e-mail, mesmo às
      vezes que eu não sei responder :-( . Mas enfim, no que eu poderia ajudar ?

      abraços
      Flávia Moreira


Deixe uma resposta




Flávia está twittando….uhu

mais acessados