none
Llamar a una dll escrita en C# desde otro dll escrita en C++

    Pregunta

  • Hola,

    Estoy intentando encontrar el modo de llamar a una función de una dll escrita en C# desde una dll en C++. La función escrita en C# es mía y está definida como pública, pero no encuentro el modo de llamarla desde C++. ¿Podría decirme alguien si es posible hacerlo?

    Lo agradeceré mucho

    Muchas gracias!

    jueves, 17 de mayo de 2018 11:25

Respuestas

  • Estimado Jose, 

    Efectivamente he hecho esta pregunta en el foro de VB6 puesto que no sabía por donde atacar la situación; y en este foro me ha propuesto Alberto que me pase a este otro de C++ puesto que parecía más apropiado encontrar la solución desde C++ que desde Visual. 

    Si sigue toda la conversación verá que:

          1. Hemos descartado acceder a C# directamente desde VB6
          2. Hemos abierto la puerta a hacerlo desde otra DLL de 2008

    Le pido disculpas si se siente ofendido por buscar alternativas en distintos foros a un tema que puede ser útil a otros programadores. Su comentario de "... exponer la clase via COM y consumirla" disculpe pero es muy genérico.  De lo que he seguido investigando me gustaría informar a otras personas que puedan estar interesadas en lo siguiente:

    Sí es posible conectar una DLL C++ con otra DLL C#, la función a escribir en C++ sería:

    HRESULT hInstance = CoInitialize(NULL); // Instancia.
    ICONNECT* pFunction = NULL;

    /* Se abre una instancia de llamada */
    hInstance = CoCreateInstance(__uuidof(Test), NULL, CLSCTX_INPROC_SERVER, __uuidof(ICONNECT), (void**) &pFunction);

    /* Se crea un puntero a la estructura creada en C# y donde despúés se almacenará la información de vuelta */
    MyInterOp::MyStruct HUGEP *pBSTR;

    /* Cierre y retorno de información */
    hInstance = SafeArrayAccessData(pFunction->GetData, (void HUGEP* FAR*) &pBSTR);

    Tengan en cuenta que el tipo de dato ICONNECT es un tipo de dato CREADO EN LA DLL de C# de modo público y que por tanto queda accesible desde C++ según está definición 

        [StructLayout(LayoutKind.Sequential)] 
        public struct MyStruct
        {
            [MarshalAs(UnmanagedType.BStr)]
            public string name;
            [MarshalAs(UnmanagedType.BStr)]
            public string surname;
            public int age;
        }


        public interface ICONNECT
        {        
            MyStruct[] GetData        
            {
                get;
            }
        }

    Espero que esta información le pueda ser de utilidad a otro programador que esté buscando como conectar entre C++ y C#




    viernes, 18 de mayo de 2018 17:43

Todas las respuestas

  • Me parece que usted es quien ha hecho como 4 variantes de la misma pregunta.  La respuesta sigue siendo la misma:  Tiene que exponer la clase via COM y consumirla como un objeto COM en C++.


    Jose R. MCP
    My GIT Repositories | Mis Repositorios GIT

    jueves, 17 de mayo de 2018 19:44
    Moderador
  • Estimado Jose, 

    Efectivamente he hecho esta pregunta en el foro de VB6 puesto que no sabía por donde atacar la situación; y en este foro me ha propuesto Alberto que me pase a este otro de C++ puesto que parecía más apropiado encontrar la solución desde C++ que desde Visual. 

    Si sigue toda la conversación verá que:

          1. Hemos descartado acceder a C# directamente desde VB6
          2. Hemos abierto la puerta a hacerlo desde otra DLL de 2008

    Le pido disculpas si se siente ofendido por buscar alternativas en distintos foros a un tema que puede ser útil a otros programadores. Su comentario de "... exponer la clase via COM y consumirla" disculpe pero es muy genérico.  De lo que he seguido investigando me gustaría informar a otras personas que puedan estar interesadas en lo siguiente:

    Sí es posible conectar una DLL C++ con otra DLL C#, la función a escribir en C++ sería:

    HRESULT hInstance = CoInitialize(NULL); // Instancia.
    ICONNECT* pFunction = NULL;

    /* Se abre una instancia de llamada */
    hInstance = CoCreateInstance(__uuidof(Test), NULL, CLSCTX_INPROC_SERVER, __uuidof(ICONNECT), (void**) &pFunction);

    /* Se crea un puntero a la estructura creada en C# y donde despúés se almacenará la información de vuelta */
    MyInterOp::MyStruct HUGEP *pBSTR;

    /* Cierre y retorno de información */
    hInstance = SafeArrayAccessData(pFunction->GetData, (void HUGEP* FAR*) &pBSTR);

    Tengan en cuenta que el tipo de dato ICONNECT es un tipo de dato CREADO EN LA DLL de C# de modo público y que por tanto queda accesible desde C++ según está definición 

        [StructLayout(LayoutKind.Sequential)] 
        public struct MyStruct
        {
            [MarshalAs(UnmanagedType.BStr)]
            public string name;
            [MarshalAs(UnmanagedType.BStr)]
            public string surname;
            public int age;
        }


        public interface ICONNECT
        {        
            MyStruct[] GetData        
            {
                get;
            }
        }

    Espero que esta información le pueda ser de utilidad a otro programador que esté buscando como conectar entre C++ y C#




    viernes, 18 de mayo de 2018 17:43
  • Parece que logró reunir todos los componentes.  Excelente.  Marque su propia respuesta como respuesta correcta para cerrar el hilo.

    Jose R. MCP
    My GIT Repositories | Mis Repositorios GIT

    viernes, 18 de mayo de 2018 18:43
    Moderador