如何通过C++ - CLI回调和委托将字符串从C++ - CLI传递给C#

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)

Ben*_*igt 2

C++std::string和 .NETSystem::String不可互换。C# 无法使用第一个,本机 C++ 代码也无法使用第二个。您需要的是一个 C++/CLI 函数,该函数在调用委托之前接受std::string并将其转换为。System::String^