Principales respuestas
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!
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 2008Le 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#
- Propuesto como respuesta webJoseModerator viernes, 18 de mayo de 2018 18:42
- Marcado como respuesta Miguel Angel M M lunes, 21 de mayo de 2018 10:12
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 -
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 2008Le 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#
- Propuesto como respuesta webJoseModerator viernes, 18 de mayo de 2018 18:42
- Marcado como respuesta Miguel Angel M M lunes, 21 de mayo de 2018 10:12
-
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