gpt4 book ai didi

c# - 如何通过 C++-CLI 回调和委托(delegate)将字符串从 C++-CLI 传递到 C#

转载 作者:太空狗 更新时间:2023-10-29 21:36:15 25 4
gpt4 key购买 nike

我有一个围绕从 C# 调用的标准 C++ 库的 C++-CLR 包装器。为了从库中接收状态消息,我使用了通过 Marshal::GetFunctionPointerForDelegate 在 C++ 代码中分配给回调的委托(delegate)。

我花了很长时间才开始工作,而且我非常非常接近(我认为)。调用了 C# 委托(delegate),但字符串未跨边界正确传递。

当我从 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;
};

--- 从托管包装器设置回调的函数----

// 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);
}

最佳答案

我一直在使用the code from this page几个月了,我发现它非常好。它只是您可以跨项目复制的一个头文件,它可以快速、干净地完成这项工作。

你用的例子

std::wstring s = clix::marshalString<E_UNICODE>(myCliString);

System::String^ s = clix::marshalString<E_ANSI>(mystdstring);

它可以双向工作,让您指定所需的编码(ANSI、UTF8 或 Windows 的 unicode——实际上是 UTF16)。

关于c# - 如何通过 C++-CLI 回调和委托(delegate)将字符串从 C++-CLI 传递到 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5784571/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com