У меня есть оболочка 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);
}