Ric*_*ams 6 c# interop c++-cli callback visual-c++
我有一个围绕从C#调用的标准C++库的C++ - CLR包装器.要从库接收状态消息,我使用通过Marshal :: GetFunctionPointerForDelegate分配给C++代码中的回调的委托.
这花了我相当长的时间才能开始工作,我非常非常接近(我想).调用C#委托,但字符串未通过边界正确传递.
当我从C++代码调用TakesCallback("Test String")时,我只是在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;
};
Run Code Online (Sandbox Code Playgroud)
---从托管包装器设置回调函数----
// 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());
}
Run Code Online (Sandbox Code Playgroud)
--- C#函数传递给C++\CLR包装器SetMessageCallBack ----
private void Message(string message)
{
XtraMessageBox.Show(message, "Done", MessageBoxButtons.OK);
}
Run Code Online (Sandbox Code Playgroud)
C++std::string和 .NETSystem::String不可互换。C# 无法使用第一个,本机 C++ 代码也无法使用第二个。您需要的是一个 C++/CLI 函数,该函数在调用委托之前接受std::string并将其转换为。System::String^