none
Problema con creacion de libreria dinamica

    Question

  • Hola,
    necesito crear una libreria dinamica en la que tengo que incluir las funciones de una aplicacion desde la cual leo del puerto serie. Mi problema es que al crear la libreria necesito pasar como argumento de la funcion un objeto SerialPort para poder leer del puerto serie, pero no consigo como hacerlo, porque si creas un proyecto de libreria dinamica no te reconoce el namespace System...(se que puede paracer logico pero estoy empezando con este lenguaje).
    ¿alguien conoce como hacerlo?he conseguido crear una libreria dinamica con el siguiente codigo pasando dos double, pero cuando le quiero pasar el SerialPort este me da error...
    // ProcesoDatosDll.cpp: define las funciones exportadas de la aplicación DLL.
    //
    
    #include "stdafx.h"
    #include "ProcesoDatosDll.h"
    
    #include <stdexcept>
    
    namespace ProcesoDatosDll
    {
        double ProcesoDatos::Add(double a, double b)
        {
            return a + b;
        }
    
    
    }
    y el .h creado para el codigo fuente es...
    namespace ProcesoDatosDll
    {
        class ProcesoDatos
        {
        public:
            // Returns a + b
            static __declspec(dllexport) double Add(double a, double b);
    
        };
    }
    gracias
    Tuesday, April 28, 2009 2:04 PM

Answers

  • ¿Has incluido el fichero de cabecera o donde tengas definido el SerialPort en el proyecto de la DLL? Es que si el fuente de la DLL no sabe qué es un SerialPort difícilmente podrás pasárselo...

    De todos modos estás hablando del "namespace System"... ¿Estás mezclando C++/CLI (.NET) con C++ (Nativo)?

    Tuesday, April 28, 2009 3:02 PM
  • No puedes pasar un objeto manejado a una función nativa, no al menos directamente (al revés sí). Una forma es acceder al componente .NET como si fuera un componente COM con todas las pegas y dificultades que tiene (eso se llama Interop CCW).

    La otra es que tu DLL sea una DLL manejada compilada con la opción /CLR del compilador, pero entonces requerirá el .NET para funcionar y pierdes la teórica ventaja del código nativo y pierde todo el sentido: haz la DLL manejada y listo. Entonces pasas una referencia:

    using namespace System;
    //otros usings

    void InstalaPuertoSerie(SerialPort ^serie)
    {
      //etc...
    }

    Pasar un objeto .NET puro a código nativo puro es factible pero bastante complejo, de hecho, casi la mitad de libro de Nishant Sivakumar C++/CLI in Action está dedicado a eso.
    Tuesday, April 28, 2009 6:44 PM
  • Sí, está claro, es una referencia, y es a lo que yo me refería: no se puede pasar nada manejado a nativo directamente si no es a través de un interfaz COM y entonces se usa de la misma forma que uno de ellos. En .NET no puedes trabajar con objetos directamente si no heredan de ValueType (es decir, son una value class o una value struct), y por eso te decía lo del objeto.

    Visual Studio tiene dos lenguajes: C++ y C++/CLI. El primero es el C++ de toda la vida. El segundo es el C++ de .NET, y ambos son totalmente diferentes aunque C++/CLI contiene a C++ (es decir, comparte la misma sintaxis que C++ pero genera código .NET).

    Luego puedes hacer dos tipos de DLL: la de C++ clásica y la de C++/CLI que es un "ensamblado de .NET", de forma que la primera se puede usar exclusivamente en proyectos nativos y la otra exclusivamente en proyectos .NET.

    Si quieres pasar un objeto .NET a una DLL nativa pura tienes que hacerlo mediante un objeto COM (que tampoco recibes un objeto, sino una referencia). Al revés no, puedes pasar y usar un objeto nativo a una función manejada, pero será tratado como si fuera manejado y entonces pierdes la compatiblidad con cualquier otro compilador.

    Por lo tanto, para crear una DLL .NET te vas al asistente de proyectos y en el diálogo de "Add new Project -> Visual C++ -> CLR", eliges "Class Library". Eso crea una DLL .NET.

    Para crear una DLL nativa te vas a "Visual C++ -> Win32 -> Win32 Project" y eliges DLL en "Application Settings".

    De todos modos, siempre que no uses una DLL nativa y con interfaz C (Es decir, la parte pública de la DLL) esa DLL dependerá no sólo del compilador, sino de la versión de este y será incompatible con otras versiones/compiladores, y más incompatible todavía con otros lenguajes que no sean C++. Y desde luego, si quieres una DLL nativa pura que sea válida para cualquier lenguaje, la única forma de pasar un objeto .NET (una referencia) es envolver ese objeto .NET en un componente COM y usarlo como tal.

    Wednesday, April 29, 2009 8:03 AM

All replies

  • ¿Has incluido el fichero de cabecera o donde tengas definido el SerialPort en el proyecto de la DLL? Es que si el fuente de la DLL no sabe qué es un SerialPort difícilmente podrás pasárselo...

    De todos modos estás hablando del "namespace System"... ¿Estás mezclando C++/CLI (.NET) con C++ (Nativo)?

    Tuesday, April 28, 2009 3:02 PM
  • ya si se que mezclo un poco .net con el nativo pero es que no estoy muy puesto...
    ¿entonces debo crear un .h que defina un SerialPort?¿pero ahi tampoco puedo utilizar el namespace System no?es que en la aplicación que he creado para trabajar con el serialport utilizo System::IO::Ports, pero claro no se como pasarlo a .dll entonces
    Tuesday, April 28, 2009 6:20 PM
  • No puedes pasar un objeto manejado a una función nativa, no al menos directamente (al revés sí). Una forma es acceder al componente .NET como si fuera un componente COM con todas las pegas y dificultades que tiene (eso se llama Interop CCW).

    La otra es que tu DLL sea una DLL manejada compilada con la opción /CLR del compilador, pero entonces requerirá el .NET para funcionar y pierdes la teórica ventaja del código nativo y pierde todo el sentido: haz la DLL manejada y listo. Entonces pasas una referencia:

    using namespace System;
    //otros usings

    void InstalaPuertoSerie(SerialPort ^serie)
    {
      //etc...
    }

    Pasar un objeto .NET puro a código nativo puro es factible pero bastante complejo, de hecho, casi la mitad de libro de Nishant Sivakumar C++/CLI in Action está dedicado a eso.
    Tuesday, April 28, 2009 6:44 PM
  • lo cierto es que lo que realmente quiero hacer es una libreria en c++, para que pueda ser utilizada por otros programas de c++, definiendo funciones y tal...por lo que no es pasar un objeto .NET puro a codigo nativo ¿no?
    si lo que tengo es que pasar una referencia...¿donde incluiria esta codigo entonces?
    se que no me entero mucho pero nunca habia programado algo así y me pierdo un poco...gracias por ayudarme

    using namespace System;
    //otros usings

    void InstalaPuertoSerie(SerialPort ^serie)
    {
      //etc...
    }

     

     

    Tuesday, April 28, 2009 8:55 PM
  • Sí, está claro, es una referencia, y es a lo que yo me refería: no se puede pasar nada manejado a nativo directamente si no es a través de un interfaz COM y entonces se usa de la misma forma que uno de ellos. En .NET no puedes trabajar con objetos directamente si no heredan de ValueType (es decir, son una value class o una value struct), y por eso te decía lo del objeto.

    Visual Studio tiene dos lenguajes: C++ y C++/CLI. El primero es el C++ de toda la vida. El segundo es el C++ de .NET, y ambos son totalmente diferentes aunque C++/CLI contiene a C++ (es decir, comparte la misma sintaxis que C++ pero genera código .NET).

    Luego puedes hacer dos tipos de DLL: la de C++ clásica y la de C++/CLI que es un "ensamblado de .NET", de forma que la primera se puede usar exclusivamente en proyectos nativos y la otra exclusivamente en proyectos .NET.

    Si quieres pasar un objeto .NET a una DLL nativa pura tienes que hacerlo mediante un objeto COM (que tampoco recibes un objeto, sino una referencia). Al revés no, puedes pasar y usar un objeto nativo a una función manejada, pero será tratado como si fuera manejado y entonces pierdes la compatiblidad con cualquier otro compilador.

    Por lo tanto, para crear una DLL .NET te vas al asistente de proyectos y en el diálogo de "Add new Project -> Visual C++ -> CLR", eliges "Class Library". Eso crea una DLL .NET.

    Para crear una DLL nativa te vas a "Visual C++ -> Win32 -> Win32 Project" y eliges DLL en "Application Settings".

    De todos modos, siempre que no uses una DLL nativa y con interfaz C (Es decir, la parte pública de la DLL) esa DLL dependerá no sólo del compilador, sino de la versión de este y será incompatible con otras versiones/compiladores, y más incompatible todavía con otros lenguajes que no sean C++. Y desde luego, si quieres una DLL nativa pura que sea válida para cualquier lenguaje, la única forma de pasar un objeto .NET (una referencia) es envolver ese objeto .NET en un componente COM y usarlo como tal.

    Wednesday, April 29, 2009 8:03 AM
  • Tuesday, May 26, 2009 9:50 PM