如何解决从C ++ / CLI调用本地std :: function
我有一个本机类,它接收std :: function作为参数,并在某个时间点调用此回调:
class NativeClass
{
public:
NativeClass(std::function<void(int,const char*)> callback) : m_callback{callback}
{
}
void DoAction()
{
...
m_callback(3,"asd");
...
}
private:
std::function<void(int,const char*)> m_callback;
}
比方说,这位于我无法控制的库中,因此std :: function是给定的。
现在我有一个C ++ / CLI类,我希望在其中调用此回调:
public ref class ManagedConsumer()
{
public:
ManagedConsumer()
{
m_nativeClass = new NativeClass(std::bind(&ManagedConsumer::OnCallback,this); // errors: 3374,2672
m_nativeClass = new NativeClass([this](...){this->OnCallback(...);}); // errors: 3374,2672
}
void OnCallback(int i,const char* str)
{
localInt += i; // must access local variable from this
// consume callback
}
private:
NativeClass *m_nativeClass;
int localInt;
}
是否有可能捕获此变量?我真的不能更改NativeClass来传递接口或其他一些东西。
解决方法
您需要在此处进行一些编组,还需要以委托的方式进行回调。
托管类.h的内容
#pragma once
using namespace System::Runtime::InteropServices;
public delegate void CallbackDelegate(int data);
public ref class ManagedClass
{
UnmanagedClass* unmanagedClassPtr;
[MarshalAsAttribute(UnmanagedType::FunctionPtr)]
CallbackDelegate^ _Delegate;
public:
ManagedClass()
{
unmanagedClassPtr = new UnmanagedClass();
_Delegate = gcnew CallbackDelegate(this,&ManagedClass::MyCallback);
auto ptr = Marshal::GetFunctionPointerForDelegate(_Delegate).ToPointer();
unmanagedClassPtr->setCallback(ptr);
}
virtual ~ManagedClass()
{
delete unmanagedClassPtr;
}
void MyCallback(int s) {
System::Console::WriteLine("hello from unmanaged");
};
};
非托管类.h的内容
#pragma once
#include "callbackType.h"
class UnmanagedClass
{
public:
void setCallback(void* _callback)
{
callback = (callbackType)_callback;
callback(13);//call it immediately
};
};
我从以下来源获得了这项工作: https://www.codeproject.com/Articles/9903/Calling-Managed-Code-from-Unmanaged-Code-and-vice和 C++/CLI delegate as function pointer (System.AccessViolationException)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。