• Sign In
 
  • MSDN Blogs
  • Microsoft Blog Images
  • More ...
Common Tasks
  • Blog Home
  • Email Blog Author
  • About
  • RSS for comments
  • RSS for posts
Blog - News
Search
  • Advanced search options...
Recent Posts
  • Corrupción de las claves RSA y la importancia de hacer backup

    Posted 1 day ago
    by Daniel Mossberg
      0 Comments
  • Modelos de programación en ASP.NET: Web Forms, MVC y Web Pages

    Posted 19 days ago
    by Daniel Mossberg
      0 Comments
  • HttpException: An error occurred while attempting to impersonate

    Posted over 2 years ago
    by Daniel Mossberg
      1 Comments
  • Problemas al subir ficheros a una aplicación ASP.NET

    Posted over 2 years ago
    by Daniel Mossberg
      0 Comments
  • Cómo reutilizar el código de una biblioteca de clases .NET desde una aplicación Silverlight

    Posted over 2 years ago
    by Daniel Mossberg
      1 Comments
Tags
  • ASP
  • ASP.NET
  • Common Language Runtime (CLR)
  • Debugging
  • Ejemplos de Código
  • Failed Request Tracing
  • Herramientas
  • IIS 6.0
  • IIS 7.0
  • Kerberos
  • Log Parser
  • Pages
  • Seguridad
  • Silverlight
  • SSL/TLS
Archives
Archives
  • May 2012 (2)
  • November 2010 (1)
  • August 2010 (1)
  • April 2010 (1)
  • March 2010 (2)
  • February 2010 (2)
  • January 2010 (2)
  • December 2009 (5)
  • October 2009 (1)
  • September 2009 (3)
  • August 2009 (1)
  • July 2009 (2)
  • May 2009 (2)
  • April 2009 (4)
  • February 2009 (1)
  • January 2009 (1)
  • December 2008 (1)
Blogs de ASP.NET / IIS
  • If broken it is, fix it you should

  • Notes from a dark corner

  • Never doubt thy debugger

  • Speaking of which...

Otros blogs recomendados
  • Blogs de Soporte en España

MSDN Blogs > The code is out there > Cómo reutilizar el código de una biblioteca de clases .NET desde una aplicación Silverlight

Cómo reutilizar el código de una biblioteca de clases .NET desde una aplicación Silverlight

Cómo reutilizar el código de una biblioteca de clases .NET desde una aplicación Silverlight

Rate This
Daniel Mossberg
13 Apr 2010 8:36 AM
  • Comments 1

Existe cierta confusión con la compatibilidad entre binarios de Silverlight y binarios de .NET, y a más de uno le pilla por sorpresa que en un proyecto de Visual Studio de una aplicación Silverlight, no se pueden referenciar bibliotecas de clases (class library) desarrolladas en .NET de escritorio (para diferenciarlo del .NET de Silverlight). El motivo es que el runtime y la biblioteca de clases de .NET para Silverlight es un subconjunto del runtime y la biblioteca de clases de .NET de escritorio, y por lo tanto no son directamente compatibles.

 

Se puede migrar el código de las clases .NET a clases .NET para Silverlight, y en ocasiones puede ser tan sencillo como recompilar el mismo código fuente (por ejemplo, como una Silverlight Class Library). En otras ocasiones esta migración no es directa, dado que la biblioteca de clases de Silverlight no contiene todas las clases que la biblioteca de clases del Framework .NET.

 

.NET Framework Class Library

http://msdn.microsoft.com/en-us/library/ms229335.aspx

 

.NET Framework Class Library for Silverlight

http://msdn.microsoft.com/en-us/library/cc838194.aspx

 

Supongamos que queremos reutilizar unas bibliotecas de clases que manejan objetos DataSet, y dado que .NET para Silverlight (hasta la versión Silverlight 4 RC) no contiene el namespace System.Data, no podemos simplemente recompilar el código fuente (fallaría la compilación dado que no estarían implementada ninguna clase DataSet).

 

Una posible implementación que nos permite reutilizar al máximo nuestras bibliotecas de clases .NET desde aplicaciones Silverlight sería implementar una interfaz, expuesta como un web service, y consumir dicho web service desde la aplicación Silverlight.

 

De esta manera, todo el código de .NET de escritorio se ejecutará en el servidor web, y la aplicación Silverlight que se ejecutará en el navegador del cliente únicamente representará la capa de presentación.

 

Os muestro un pequeño ejemplo en C# como prueba de concepto. En este ejemplo, el web service está implementado como un web service de ASP.NET 2.0 (*.asmx), pero considerad la posibilidad de implementarlo como un web service WCF (Windows Communication Foundation), que es la siguiente generación de web services de .NET.

 

Supongamos que tenemos la siguiente clase en nuestra biblioteca de lógica de negocio. Esta es la clase cuyo código nos gustaría reutilizar en Silverlight, pero dado que hace uso de System.Data no podemos recompilar el código sin más.         

 

using System;

using System.Data;

 

namespace SilverlightTest.Web

{

    public class BusinessLogic

    {

        public DataSet getCustomerData(int customerID)

        {

            DataSet dataSet = new DataSet();

            DataTable dataTable = new DataTable();

 

            dataTable.Columns.Add("Columna 1");

            dataTable.Columns.Add("Columna 2");

 

            dataTable.Rows.Add(new object[] { "celda 0-0", "celda 0-1" });

            dataTable.Rows.Add(new object[] { "celda 1-0", "celda 1-1" });

            dataTable.Rows.Add(new object[] { "celda 2-0", "celda 2-1" });

            dataTable.Rows.Add(new object[] { "celda 3-0", "celda 3-1" });

 

            dataSet.Tables.Add(dataTable);

 

            return dataSet;           

        }

    }

}

 

Para solventar este problema, podemos crear un web service que exponga el método getCustomerData. En este caso, para hacerlo compatible con Silverlight, convertiremos el objeto DataSet en uno o varios arrays bidimensionales (uno por cada DataTable del DataSet) antes de enviar la respuesta al cliente Silverlight:

 

using System;

using System.Data;

using System.Web;

using System.Web.Services;

using SilverlightTest.Web;

 

[WebService]

public class SilverlightInterface : System.Web.Services.WebService

{

 

    [WebMethod]

    public object[][] getCustomerData(int customerID)

    {

        //Utilizamos la lógica de la biblioteca de clases de .NET de escritorio

        BusinessLogic businessLogic = new BusinessLogic();

        DataSet dataSet = businessLogic.getCustomerData(customerID);

 

        int x = dataSet.Tables[0].Rows.Count;

        int y = dataSet.Tables[0].Columns.Count;

 

        //Declaramos y demensionamos el Array

        object[][] dataArray = new object[x][];

 

        for (int i = 0; i < x; i++)

        {

            dataArray[i] = new object[y];

        }

 

        //Rellenamos el Array con los datos del DataSet

        for (int i = 0; i < x; i++)

        {

            for (int j = 0; j < y; j++)

            {

                dataArray[i][j] = dataSet.Tables[0].Rows[i][j];

            }

        }

 

        return dataArray;

    }

}

 

Por último, desde el cliente Silverlight consumimos el web service de la siguiente manera tras haber incluido la referencia web (que hemos llamado BusinessLogicWS):

 

public partial class SilverlightPage : UserControl

{

    public SilverlightPage()

    {

        InitializeComponent();       

 

        //Creamos el objeto proxy para interactuar con el web service

        BusinessLogicWS.SilverlightInterfaceSoapClient wsProxy =

            new BusinessLogicWS.SilverlightInterfaceSoapClient();

 

        wsProxy.getCustomerDataCompleted

            += new EventHandler

                <BusinessLogicWS.getCustomerDataCompletedEventArgs>

                (getCustomerDataCompletedHandler);

 

        int CustomerID = 1234;

 

        //Realizamos la llamada asíncrona al web service       

        wsProxy.getCustomerDataAsync(CustomerID);

    }

 

    void getCustomerDataCompletedHandler(object sender,

        BusinessLogicWS.getCustomerDataCompletedEventArgs e)

    {

        //Obtenemos los datos de la respuesta del web service

        ObservableCollection<SilverlightTest.BusinessLogicWS.ArrayOfAnyType>

            data = e.Result;           

 

        //Hacemos algo con esos datos

        for (int i=0; i<data.Count; i++)

        {

            for (int j = 0; j < data[i].Count; j++ )

            {

                Debug.WriteLine(data[i][j].ToString());               

            }

        }

    }

}

 

De esta forma, hemos construido una interfaz entre la aplicación Silverlight y nuestra biblioteca de clases .NET, pudiendo reutilizar el código de las bibliotecas de clases .NET y solventando los problemas de incompatibilidades entre tipos de datos.

 

Hasta el próximo post,

- Daniel Mossberg

  • 1 Comments
Ejemplos de Código, Silverlight
Leave a Comment
  • Please add 5 and 3 and type the answer here:
  • Post
Comments
  • Javier
    23 Apr 2010 1:59 PM

    Hola,

    tengo una duda, en esta parte nose como hacelor

    ObservableCollection<SilverlightTest.BusinessLogicWS.ArrayOfAnyType>            data = e.Result;

    En particular esta parte: SilverlightTest.BusinessLogicWS.ArrayOfAnyType

    yo tengo mi referencia algo asi como esta:

    using SilverDemo02.WS2005;

    no me muestra de ninguna forma la propiedada ArrayOfAnyType que me falta???

Page 1 of 1 (1 items)
  • © 2012 Microsoft Corporation.
  • Terms of Use
  • Trademarks
  • Privacy Statement
  • Report Abuse
  • 5.6.402.223