Tengo un C++ - CLR envoltorio alrededor de una biblioteca estándar de C++ llamada desde C#. Para recibir mensajes de estado de la biblioteca, utilizo un delegado asignado a una devolución de llamada en el código C++ a través de Marshal :: GetFunctionPointerForDelegate.Cómo pasar una cadena de C++ - CLI a C# a través de C++ - devoluciones de llamada de la CLI y delegados
Esto me ha llevado bastante tiempo para ponerme a trabajar y estoy muy, muy cerca (creo). Se llama al delegado C# pero la cadena no se pasa correctamente a través del límite.
Cuando llamo a TakesCallback ("Cadena de prueba") desde el código C++ me sale basura en la función C#.
--- La clase y la devolución de llamada función original de C++ ---
class Solver
{
private:
std::string TakesCallback(const std::string message)
{
return cb(message);
}
public:
// Declare an unmanaged function type that takes a string
typedef std::string (__stdcall* ANSWERCB)(const std::string);
ANSWERCB cb;
};
--- función para establecer la devolución de llamada desde el contenedor administrado ----
// Set the delegate callback
void ManagedSolver::SetMessageCallback(SendMessageDelegate^ sendMessageDelegate)
{
_sendMessage = sendMessageDelegate;
// Use GetFunctionPointerForDelegate to get the pointer for delegate callback
IntPtr ip = Marshal::GetFunctionPointerForDelegate(sendMessageDelegate);
_solver->cb = static_cast<Solver::ANSWERCB>(ip.ToPointer());
}
--- C# de función se pasa al SetMessageCallBack C++ \ CLR envoltorio ----
private void Message(string message)
{
XtraMessageBox.Show(message, "Done", MessageBoxButtons.OK);
}
¿Seguro que quieres decir de C++? Las Extensiones administradas para C++ dejaron de ser compatibles con (creo) Visual Studio 2003. C++/CLI es su reemplazo, y es un lenguaje completamente diferente ... –
Hola Billy, lo siento, tienes razón, por supuesto. Mi contenedor es C++/CLR alrededor de una biblioteca estándar de C++. He actualizado el título y el cuerpo. –
OK Lo he resuelto std :: string no funcionará con interoperabilidad debido a la variedad de implementaciones que se indican aquí http://stackoverflow.com/questions/874551/stdstring-in-c Volveré y responderé esto tan pronto como StackOverflow me lo permita. –