作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个围绕从 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/
我参加了一些类(class)并阅读了 YAGNI 的用途。但是,作为一个整体,这个原则从来没有让我满意。它引入了一个逻辑悖论。 作为一个假设,您正在设计一个打算向前扩展的框架。 YAGNI(可能还有
我是一名优秀的程序员,十分优秀!