He estado trabajando en una aplicación de código prototipo que se ejecuta en C# y utiliza clases y funciones del código C++ anterior (en forma de una DLL importada). El requisito del código es pasar un objeto de clase a la DLL de C++ no administrada (desde C#) y hacer que sea almacenada/modificada para que la aplicación C# la recupere posteriormente. Aquí está el código que tengo hasta ahora ...Pasar un objeto clase C# dentro y fuera de una clase DLL C++
simple C++ DLL Clase:
class CClass : public CObject
{
public:
int intTest1
};
C++ funciones DLL:
CClass *Holder = new CClass;
extern "C"
{
// obj always comes in with a 0 value.
__declspec(dllexport) void SetDLLObj(CClass* obj)
{
Holder = obj;
}
// obj should leave with value of Holder (from SetDLLObj).
__declspec(dllexport) void GetDLLObj(__out CClass* &obj)
{
obj = Holder;
}
}
C# clase y Envoltura:
[StructureLayout(LayoutKind.Sequential)]
public class CSObject
{
public int intTest2;
}
class LibWrapper
{
[DLLImport("CPPDLL.dll")]
public static extern void SetDLLObj([MarshalAs(UnmanagedType.LPStruct)]
CSObject csObj);
public static extern void GetDLLObj([MarshalAs(UnmanagedType.LPStruct)]
ref CSObject csObj);
}
C# Llamada de función a DLL:
class TestCall
{
public static void CallDLL()
{
...
CSObject objIn = new CSObject();
objIn.intTest2 = 1234; // Just so it contains something.
LibWrapper.SetDLLObj(objIn);
CSObject objOut = new CSObject();
LibWrapper.GetDLLObj(ref objOut);
MessageBox.Show(objOut.intTest2.ToString()); // This only outputs "0".
...
}
}
Nada más que los valores no deseados parecen estar disponibles dentro de la DLL (proveniente del objeto C# pasado). Creo que me falta algo con el marshalling de clase o un problema de memoria/puntero. ¿Qué me estoy perdiendo?
Edit: He cambiado el código anterior para reflejar los cambios a las definiciones de método/función, en C#/C++, sugerido por Bond. El valor (1234) que se transfiere se recupera correctamente con el código C#. Esto ha expuesto otro problema en la DLL de C++. El valor 1234 no está disponible para el código C++. En cambio, el objeto tiene un valor de 0 dentro de la DLL. Me gustaría usar funciones predefinidas de C++ para editar el objeto desde el archivo DLL. Cualquier otra ayuda es muy apreciada. ¡Gracias!
__declspec (dllexport) SetDLLObj vacío (obj CClass) { Holder = &obj; } habrá dolor puntero de CClass local, por lo que puede conseguir Couse chatarra de ello. – user629926
parece que el Titular está almacenando el valor que ingresa al código de C++ para su posterior recuperación. Puedo echarle un vistazo, pero mi preocupación principal en este momento es extraer un valor del objeto pasado a la DLL. – notsodev