У меня есть оболочка C ++ - CLR вокруг стандартной библиотеки C ++, вызываемой из C #. Чтобы получать сообщения о состоянии из библиотеки, я использую делегат, назначенный для обратного вызова в коде C ++ через Marshal :: GetFunctionPointerForDelegate.
Это заняло у меня довольно много времени, чтобы приступить к работе, и я очень, очень близок (я думаю) . Вызывается делегат C #, но строка не передается правильно через границу.
Когда я вызываю TakesCallback («Test String») из кода C ++, я просто получаю мусор обратно в функции C #.
--- Исходный класс 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;
};
--- Функция для установки обратного вызова из управляемой оболочки ----
// 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 # передана в оболочку C ++ \ CLR SetMessageCallBack ----
private void Message(string message)
{
XtraMessageBox.Show(message, "Done", MessageBoxButtons.OK);
}