none
Porque no compila c++? RRS feed

Respuestas

  • Hola rgapa.

    No me explique bien, cuando dije que se crea un archivo service1.svc me refieria al archivo de codigo del servicio que suele ser "service1.svc.cs".

    Bien vamo por pasos.

    No se como has creado el Servicio WCF ya que te sale el archivo interface y el de la clase (en el directorio App_code). En un principio estos salen por defecto al crear un servicio WCF normal y corriente, pero tienes que tener en cuenta que si creas un servicio WCF normal tienes que modificar el binding en la configuracion para adaptarlo a silverlight.
    Para silverlight existe un tipo de servicio WCF configurado ya para su uso, el cual al agregar un nuevo item esta en la categoria silverlight y se llama "Servicio WCF habilitado para silverlight" el cual ya esta configurado para usar con silverlight.
    Este servicio no te crea un interface, solo te crea la clase (al menos en VS2008, no lo he probado en 2010) de modo que se queda un archivo .svc y otro .svc.cs.

    En cualquier caso el codigo se debe insertar en la clase del servicio WCF por defecto la que tiene el mismo nombre.svc.cs
    Lo primero que tienes que probar es si te funciona el servicio, esto se prueba con el boton derecho en el archivo .svc y pulsando en "ver en el explorador" con lo cual te debe salir las instrucciones de uso en el explorador web, si te salen te funciona todo OK, si no es posible que no tengas instalado el servicio WCF en el IIS.


    2.- La dll en c++ se debe incluir siempre junto con los binarios de la aplicacion que la va a vincular, en este caso como el que la vincula el el sitio web, la dll debe estar en el directorio "bin" del sitio web, pero no hace falta agregarla desde el visual en el proyecto ya que al ser una DLL se vincula dinamicamente como su nombre indica, tan solo hace falta insertar el arcvhivo en el directorio "bin" y sera vinculada en tiempo de ejecucion.

    ya me contaras como te ha ido.



    Saludos
    David González
    martes, 23 de febrero de 2010 7:37
  • Hola rgapa.

    He podido ver tu proyecto.

    El unico problema que existia es que no tenias la DLL de C actualizada en el directorio Bin del web.

    Al realizar este tipo de operaciones debes de tener varias cosas en cuenta.
    Las librerias que no son .net no se pueden agregar como referencias, ya que no son librerias con codigo manejado y se hace uso de ellas de la forma habitual en win32, cargandolas y usando la funcion deseada, como en cualquier lenguaje compilado base (ensamblador, c/c++, etc.), ello requiere que obviamente la libreria este en el mismo directorio del ejecutable o se haga referencia mediante una variable de entorno.

    Bien, en tu caso, tenemos que la libreria esta en la misma solucion y se compila con ella, pero al no estar referenciada en el proyecto WEB, no agrega la libreria al directorio BIN en cada compilacion, de modo, que la libreria no se actualiza.

    En tu caso, tienes varias opciones para resolver esto, de las cuales te comento 2 ya que se esta en un entorno de desarrollo:

    1.- cada vez que vayas a compilar el proyecto, si has echo alguna modificacion en la DLL en C, debes de compilarla primero y pasarla manualmente al directorio BIN del proyecto WEB.

    2.- configuras el proyecto C para que el directorio de salida sea el directorio BIN del proyecto WEB, de modo que se generara todo automaticamente y no te tendras que preocupar.
    Para realizar esta ultima opcion, debes entrar en las propiedades del proyecto C y buscas en el arbol de la izquierda la opcion:
    Configuration Properties -> General, y a la derecha veras las opciones de configuracion general, donde una de ellas es "Output Directory" que es el directorio de salida de la libreria, donde debes establecer la ruta, en el proyecto que tienes debe ser algo como:

    $(SolutionDir)\BuscaRutaParalelo.Web\bin\

    donde $SolutionDir es una variable de entorno que indica la ruta relativa a la solucion en VS.

    Ya me diras si te ha ido bien.


    Saludos
    David González
    jueves, 11 de marzo de 2010 11:15

Todas las respuestas

  • Hola rgapa.


    Las librerias externas al igual que en c/c++ deben de estar junto al ejecutable para que se puedan linkar (o crear variables de entorno)
    en un proyecto de c# se puede dejar la .dll junto al ejecutable en el directorio bin, pero silverlight crea un paquete que contiene su .dll mas el codigo xaml.

    Este paquete .xap realmente es un .zip que puedes descomprimir y ver lo que tiene dentro.

    Pues bien, para que te funcione lo que deseas, debes de poder insertar la .dll en el paquete que genera silverlight.

    Una forma sencilla de hacerlo es a nivel de proyecto silverlight -> agreagar nuevo elemento externo  y buscar la libreria, con lo que se quedara en la raiz del proyecto en el explorador de soluciones.

    Una vez tengas la libreria en el proyecto, compilas y listo, veras en el .xap que tambien se ha agregado la .dll externa.

    Ya me contaras como te ha ido.

    Saludos
    David González
    miércoles, 10 de febrero de 2010 22:26
  • Hola rgapa.

    Tienes razon, no se puede debido al nivel de seguridad bajo el que corre silverlight, incluso no se puede agregar referencias de c#, tienes que hacerlo mediante servicios web.
    En un principio, si quieres realizar un servicio, puedes hacerlo, este no tiene por que ser de c++, puedes crearte un servicio WCF de c# y enlazarlo directamente.

    Hace un tiempo escribi un documento sobre como configurar el servicio tanto para HTTP como en socket serguro HTTPS, lo puedes encontrar aqui:



    Corregido: he intentando realizar la primera opcion y no he tenido exito, he probado modificar la seguridad pero siempre salta una excepcion de seguridad.
    Lo cual es logico, ya que silverlight solo puede trabajar en entornos seguros si no seria un fallo de seguridad bastante alto.

    Asi pues y sin realizar cosas raras, lo mas facil es realizar un servicio WCF para hacer las llamadas.



    Saludos
    David González
    viernes, 12 de febrero de 2010 7:34
  • Hola rgapa.

    Tienes razon, no funciona por el contexto de seguridad de silverlight, no se que hice para que me funcionase pero no he podido volver a replicarlo, asi que tendremos que hacer lo que comenta microsoft, que es crear un servicio web y llamarlo para acceder a librerias externas a silverlight. (Sera mucho mas rapido y mas seguro).

    Realmente solo deberias de crearte un servicio WCF y desde este llamar a la libreria, silverlight se deberia de comuncar con este servicio WCF para acceder a la libreria.

    Si tienes problemas para la creacion de un servicio WFC o la vinculacion con la libreria comentalo.




    Saludos
    David González
    domingo, 14 de febrero de 2010 19:24
  • Exacto, en el link lo explica muy bien paso a paso.

    un servicio WCF en el cual puedes llamar a codigo nativo si lo deseas.


    En realidad en Silverlight existen 3 formas de realizar esto, te comente el servicio WCF por ser posiblemente lo mas facil de implementar mediante su asistente, pero existen estas formas de llamar a librerias:


    - servicio web (asmx), un servicio web de toda la vida 
    - servicio WCF.
    - servicios Rest: este tipo esta basado en mensajes sobre solicitudes http mediante los verbos get, post, put y delete, que son el CRUD de toda la vida en el acceso a datos, suelen estar mas orientados a acceder a datos.

    Hasta hoy estas son las 3 formas de comunicacion de silverlight con un servidor.

    Saludos
    David González
    • Propuesto como respuesta David_González martes, 16 de febrero de 2010 7:50
    martes, 16 de febrero de 2010 7:49
  • Hola rgapa.

    Que entre codigo c++ ¿te refieres a que el servicio WCF haga uso de una libreria de c++ y el resultado se lo pase a silverlight?.
    ¿o quieres crear el servicio WCF directamente en c++ por alguna razon?.



    Saludos
    David González
    miércoles, 17 de febrero de 2010 7:20
  • Hola rgapa.

    He estado un poco liado y no te he podido responder antes.

    Vale voy a explicar como crear un servicio WCF para silverlight:

    Partimos del punto que se ha creado una solucion que contiene un proyecto silverlight y un sitio web donde sera desplegada, con lo que hay 2 proyectos en la solucion.

    En el proyecto web, se agrega un nuevo elemento de categoria: silverlight, elemento: Servicio WCF habilitado para silverlight.
    En principio vale cualquier servicio WCF, pero este ya viene configurado para usarse con silverlight y no tenemos que tocar nada de su configuracion por defecto.

    Esto nos ha creado un archivo "service1.svc" en el, existe una funcion por defecto que podemos borrar, en su lugar es la que voy a usar para el ejemplo, de modo que el archivo quedaria algo asi:

    namespace SilverlightApplication1.Web
    {
        [ServiceContract(Namespace = "")]
        [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
        public class Service1
        {
    
            [System.Runtime.InteropServices.DllImport("LibreriaDLLEnC.dll")]
            public static extern int suma(int a, int b);
    
            [OperationContract]
            public int DoWork()
            {
                int x = 2;
                int y = 3;
                // Agregue aquí la implementación de la operación
                return suma(x, y);
            }
    
            // Agregue aquí más operaciones y márquelas con [OperationContract]
        }
    }
    

    Si hay algo del codigo anterior que no se entiende lo comentais.

    Con esto ya tendriamos creado el servicio WCF llamando a la funcion de la libreria en c++.
    Ahora se debera añadir el servicio a silverglith, boton derecho en el proyecto y agregar referencia de servicio, se pulsa en "detectar" para buscar las de la solucion y se agrega, para el ejemplo yo dejo el nombre por defecto "ServiceReference1".

    Una vez agregada se habra creado un archivo con la configuracion del servicio.
    ahora solo hace falta llamar al servicio web, para ello y en silverlight, esto se hace siempre asincronamente ya que es como trabaja silverlight con el servidor, de modo que se crea un boton de ejemplo y en su evento click se añadira el codigo como el siguiente:

            /// <summary>
            /// Evento del boton para llamar al servicio WCF
            /// </summary>
            /// <param name="sender">objeto remitente</param>
            /// <param name="e">argumentos del evento</param>
            private void btn_Click(object sender, RoutedEventArgs e)
            {
                // Inicializar el servicio WCF
                ServiceReference1.Service1Client a = new SilverlightApplication1.ServiceReference1.Service1Client();
    
                // crear el evento que sera llamado al completarse la llamada
                a.DoWorkCompleted += new EventHandler<SilverlightApplication1.ServiceReference1.DoWorkCompletedEventArgs>(a_DoWorkCompleted);
    
                // llamar a la funcion DoWork() del servicio web asincronamente
                a.DoWorkAsync();
            }
    
            /// <summary>
            /// Evento ocurrido al completar una llamada asincrona al servicio WCF
            /// </summary>
            /// <param name="sender">objeto remitente</param>
            /// <param name="e">argumentos del evento</param>
            void a_DoWorkCompleted(object sender, SilverlightApplication1.ServiceReference1.DoWorkCompletedEventArgs e)
            {
                // mostrar el resultado
                MessageBox.Show(e.Result.ToString());
            }

    Como se puede observar las funciones de llamada al servicio WCF se compone del nombre de la funcion + async, debido a que la llamada se realiza asincronamente.

    Con esto ya estaria todo para llamar a la libreria.

    Ya me contaras como te ha ido.








    Saludos
    David González
    • Propuesto como respuesta David_González martes, 23 de marzo de 2010 7:21
    • Propuesto como respuesta David_González lunes, 19 de abril de 2010 7:19
    • Votado como útil rgapa jueves, 29 de abril de 2010 15:39
    • Propuesto como respuesta David_González viernes, 7 de mayo de 2010 16:12
    lunes, 22 de febrero de 2010 8:19
  • Hola rgapa.

    No me explique bien, cuando dije que se crea un archivo service1.svc me refieria al archivo de codigo del servicio que suele ser "service1.svc.cs".

    Bien vamo por pasos.

    No se como has creado el Servicio WCF ya que te sale el archivo interface y el de la clase (en el directorio App_code). En un principio estos salen por defecto al crear un servicio WCF normal y corriente, pero tienes que tener en cuenta que si creas un servicio WCF normal tienes que modificar el binding en la configuracion para adaptarlo a silverlight.
    Para silverlight existe un tipo de servicio WCF configurado ya para su uso, el cual al agregar un nuevo item esta en la categoria silverlight y se llama "Servicio WCF habilitado para silverlight" el cual ya esta configurado para usar con silverlight.
    Este servicio no te crea un interface, solo te crea la clase (al menos en VS2008, no lo he probado en 2010) de modo que se queda un archivo .svc y otro .svc.cs.

    En cualquier caso el codigo se debe insertar en la clase del servicio WCF por defecto la que tiene el mismo nombre.svc.cs
    Lo primero que tienes que probar es si te funciona el servicio, esto se prueba con el boton derecho en el archivo .svc y pulsando en "ver en el explorador" con lo cual te debe salir las instrucciones de uso en el explorador web, si te salen te funciona todo OK, si no es posible que no tengas instalado el servicio WCF en el IIS.


    2.- La dll en c++ se debe incluir siempre junto con los binarios de la aplicacion que la va a vincular, en este caso como el que la vincula el el sitio web, la dll debe estar en el directorio "bin" del sitio web, pero no hace falta agregarla desde el visual en el proyecto ya que al ser una DLL se vincula dinamicamente como su nombre indica, tan solo hace falta insertar el arcvhivo en el directorio "bin" y sera vinculada en tiempo de ejecucion.

    ya me contaras como te ha ido.



    Saludos
    David González
    martes, 23 de febrero de 2010 7:37
  • Hola rgapa.

    Los examenes matan, jejeje.

    Bien, el servicio web es tan solo una fachada (basicamente se basan todos en aplicar el patron facade), de modo que hay que pensar de ese modo, por lo tanto es como un nexo de union o una interface. Asi pues para añadir mas funciones, debes de añadir mas funciones en el servicio web, en el caso mas basico debe haber una funcion en el servicio web por cada funcion de la libreria.

    Silverlight solo puede llamar al servicio web, y el servicio web llama a la libreria c++, de modo que el servicio web es tan solo como si fuera una definicion de las funciones de la libreria c++.

    ¿Se entiende?

    Saludos
    David González
    viernes, 5 de marzo de 2010 7:37
  • Hola rgapa.

    No he podido ver tu ejemplo, ya que tengo VS2010 Beta2 y hace falta la RC para la configuracion que tienes.
    a ver si me la descargo y le puedo echar un vistazo.

    En cuanto a lo del cliente, en realidad no funciona sobre el cliente, si no en el servidor. Silverlight funciona en el cliente, pero cuando se llama al servicio web se llama al servidor y hace uso de la libreria c++ que esta en el servidor tambien.

    Las funciones de c++ dependiendo de lo que van a hacer puedes hacer uso de multithread o no, eso ya depende de la funcionalidad, pero en cualquier caso seran ejecutadas por el servidor.

    En cuanto al Intel Threading, puedes hacer uso de el (aunque creo que es una libreria de pago) y .net 4 te ofrece funcionalidades multithread, no obstante solo bajo .net

    implementar varios hilos en c++ no es tarea facil, bueno lo dificil es que trabajen conjuntos, es decir que varios hilos trabajen a la vez para una misma tarea, ya que tiene que estar muy bien definida la concurrencia y el reparto de tareas (aunque hagas uso de esa libreria).

    a ver si me descargo la RC y le echo un vistazo al proyecto.





    Saludos
    David González
    martes, 9 de marzo de 2010 14:26
  • Hola rgapa.

    Creo que me he perdido ya en lo que quieres hacer. A ver.

    Tu libreria c++ quieres que use multi hilo y la quieres llamar desde silverlight ¿no?.

    Si esto es asi, la libreria c++ va a correr en el servidor con todos sus nucleos y procesadores (dependiendo de como la programes).
    Ahora bien, silverlight corre en el cliente y en un principio para realizar una llamada a un servicio web que llame a su vez a la libreria de c++ no hace falta el uso de multihilo, ya que es una simple peticion web. El servidor es el que se va a llevar la carga (el proceso de la DLL en c++) y sera el servidor el que retorne al cliente (app silverlight) los datos del proceso de la DLL.

    Otra cosa seria que quieras implementar multihilo en el cliente silverligth para otro proceso independiente de la libreria c++, pero esto ya es otro tema.

    En cuestion, para llamar a una libreria c++ que reside en el servidor, al cliente le va a dar igual usar multihilo, ya que a fin de cuentas solo va a procesar una peticion a un servicio web asincronamente (en el caso de silverlight)

    Saludos
    David González
    miércoles, 10 de marzo de 2010 11:05
  • Hola rgapa.

    He podido ver tu proyecto.

    El unico problema que existia es que no tenias la DLL de C actualizada en el directorio Bin del web.

    Al realizar este tipo de operaciones debes de tener varias cosas en cuenta.
    Las librerias que no son .net no se pueden agregar como referencias, ya que no son librerias con codigo manejado y se hace uso de ellas de la forma habitual en win32, cargandolas y usando la funcion deseada, como en cualquier lenguaje compilado base (ensamblador, c/c++, etc.), ello requiere que obviamente la libreria este en el mismo directorio del ejecutable o se haga referencia mediante una variable de entorno.

    Bien, en tu caso, tenemos que la libreria esta en la misma solucion y se compila con ella, pero al no estar referenciada en el proyecto WEB, no agrega la libreria al directorio BIN en cada compilacion, de modo, que la libreria no se actualiza.

    En tu caso, tienes varias opciones para resolver esto, de las cuales te comento 2 ya que se esta en un entorno de desarrollo:

    1.- cada vez que vayas a compilar el proyecto, si has echo alguna modificacion en la DLL en C, debes de compilarla primero y pasarla manualmente al directorio BIN del proyecto WEB.

    2.- configuras el proyecto C para que el directorio de salida sea el directorio BIN del proyecto WEB, de modo que se generara todo automaticamente y no te tendras que preocupar.
    Para realizar esta ultima opcion, debes entrar en las propiedades del proyecto C y buscas en el arbol de la izquierda la opcion:
    Configuration Properties -> General, y a la derecha veras las opciones de configuracion general, donde una de ellas es "Output Directory" que es el directorio de salida de la libreria, donde debes establecer la ruta, en el proyecto que tienes debe ser algo como:

    $(SolutionDir)\BuscaRutaParalelo.Web\bin\

    donde $SolutionDir es una variable de entorno que indica la ruta relativa a la solucion en VS.

    Ya me diras si te ha ido bien.


    Saludos
    David González
    jueves, 11 de marzo de 2010 11:15
  • ¿a que te refieres con un hosting no local? ¿a desplegarlo en el IIS de tu computadora y tenerlo visible desde internet?.



    Saludos
    David González
    viernes, 12 de marzo de 2010 11:31
  • hola rgapa.

    para explicarte el proceso deberia saber la configuracion siguiente:

    ¿tienes router para salir a internet?
    ¿sistema operativo del servidor?
    ¿tienes ip fija o dinamica?



    Saludos
    David González
    sábado, 13 de marzo de 2010 0:05
  • Hola rgapa.

    a ver si lo explico en algunos pasos (para windows XP), en Vista y 7 es casi igual pero la administracion del IIS es diferente.

    Basicamente: El servidor de aplicaciones web de windows se denomina IIS (Intenet Information Services) y cada version de windows tiene una version diferente con algunas limitaciones.
    En windows XP se tiene un solo sitio web en el cual se pueden ir colgando diferentes directorios virtuales con las diferentes aplicaciones, si se dispone de vista o 7 se pueden crear mas de un sitio web (dependiendo de la version del SO).

    Bueno comenzamos por el principio:

    1.- instalar el IIS, ya que por defecto no se instala. Esto se hace desde el panel de control -> instalar programas -> agregar componentes de windows -> chequear "Servicios Internet Informacion Server" e instalar (por defecto ya se activan las opciones necesarias, pero puedes agregar o quitar opciones al gusto)

    2.- instalar las extensiones .net en el IIS, para ello se debe abrir una consola (con permisos de administracion) y escribir lo siguiente:

    C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727>aspnet_regiis.exe - i


    3.- se puede aprobechar e instalar lel modelo de servicio para los servicios WCF con la siguiente linea:

    C:\WINDOWS\Microsoft.NET\Framework\v3.0\Windows Communication Foundation>ServiceModelReg.exe - i


    4.- en un principio, ya esta todo instalado, deberias abrir un navegador y escribir http://localhost/ y saldra la pagina prinicipal del IIS.
    El servidor por defecto se guarda bajo la ruta "C:\Inetpub\wwwroot", donde podras crear tu sitio. No obstante lo ideal es usar el directorio que tu quieras y dejar este intacto, para ello te vas al IIS (boton derecho en mi pc -> administrar) en la ventana que se habre se selecciona "servicios y aplicaciones -> servicios de internet Information" y boton derecho en "Sitio web predeterminado -> nuevo -> Directorio virtual", se sigue el asistente y se crea un directorio nuevo para el tu web, de forma que podras acceder mediante "http://localhost/directorio/"

    NOTA: La carpeta que tiene el sitio web debe tener suficientes permisos para todos los usuarios, ya que es el usuario de internet el que navega y a no ser que suplantes al usuario debe de tener privilegios.


    5.- Ya solo queda abrir el firewall en el puerto 80 para las peticiones HTTP desde internet, de modo que entrando tu direccion IP externa puedas entrar a tu pagina desde internet.

    Puedes hacer uso de algun servidor de DNS para ip dinamicas, de modo que tengas un DNS asociado a tu ip, y si esta cambia, se actualiza el DNS.
    algunos servicios gratuitos son:



    En un principio esto es todo a grandes rasgos. Si necesitas ayuda en algo concreto comentalo.









    Saludos
    David González
    lunes, 15 de marzo de 2010 8:37
  • Hola rgapa.

    Intenta abrir un tema nuevo para algo que no tenga que ver con este. Gracias.

    Por otra parte, hace tiempo escribi un post sobre el tema:

    http://social.msdn.microsoft.com/Forums/es-ES/wpfes/thread/c396a243-f25b-4461-ae47-dfd1a3d31525

     

     


    Saludos
    David González
    lunes, 19 de abril de 2010 7:18
  • Hola David,

    Tengo el mismo problema y seguí tus instrucciones con éxito, pero tengo un problema.

    Mi desarrollo funciona OOB ( out of browser) y lee correctamente la librería .dll mientras la ejecuto en mi PC. Incluso en modo OOB.

    Pero cuando la intalo en otra PC, no lee la librería. A la .dll la incluí en el directorio /BIN y veo en el servidor que está OK.

    Alguna idea ?.

    Gracias,

    José

    miércoles, 21 de abril de 2010 18:56
  • Hola joselaks.

     

    ¿Accedes a ella mediante un servicio WCF?

    ¿donde te da el error?


    Saludos
    David González
    jueves, 22 de abril de 2010 15:38