我想将C ++成员函数作为回调传递给C#项目。我在C ++ / CLI中还有其他项目,我想通过它完成。
因此,在我的C ++ / CLI项目的非托管C ++中,我有一个函数对象:std::function<void(int)>callback;
该函数来自我的C ++项目,并且工作正常,为避免上一步,我将其保存为示例。现在,我想将此回调函数传递给我的C#项目。为此,我在非托管C ++中创建了一个方法,将其传递给托管C ++,从这一点开始,最终将其传递给C#。我想要这样的东西:
// Unmanaged class
public class Wrapper
{
public:
std::function<void(int)>callback;
void ReturnToCallback(int data)
{
callback(data);
}
void PassCallback()
{
NETWrapper netWrapper;
netWrapper.TestCallback(ReturnToCallback);
}
};
//Managed class
public ref class NETWrapper
{
public:
void TestCallback(Action<int>^ callback)
{
StartGenerator^ startGen = gcnew StartGenerator(callback);
}
};
// C#
public class StartGenerator
{
private Communication comm;
public StartGenerator(Action<int> callback)
{
comm = Communication.Instance;
comm.callback = callback;
}
}
当然,此解决方案在编译时会给我一个错误:
错误3错误C3867:'IfaceXXX :: Wrapper :: ReturnToCallback':函数调用缺少参数列表;使用'&IfaceXXX :: Wrapper :: ReturnToCallback'创建指向成员d:\ XXX.h的指针
我尝试了其他方法,例如获取函数指针的委托,以便可以在托管C ++上工作并将其传递给C#,但是我无法正确实现它。您认为尝试此操作的最佳方法是什么?
Wrapper::callback
的指针std::function
。ref class
。而已。
public ref class Wrapper
{
public:
std::function<void(int)>* callback;
void ReturnToCallback(int data)
{
(*callback)(data);
}
void PassCallback()
{
NETWrapper netWrapper;
netWrapper.TestCallback(gcnew Action<int>(this, &Wrapper::ReturnToCallback));
}
};
然后,您确实需要管理std::function
现在的生命周期,也许我clr_scoped_ptr
可以向您展示如何做到这一点。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句