从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来传递接口或其他一些东西。

pqlay 回答:从C ++ / CLI调用本地std :: function

您需要在此处进行一些编组,还需要以委托的方式进行回调。

托管类.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-viceC++/CLI delegate as function pointer (System.AccessViolationException)

本文链接:https://www.f2er.com/1323629.html

大家都在问