无法调用 System::Action^

Cannot call System::Action^

我有一个 C++/CLI 项目。在这个 C++/CLI 项目中,我编写了一个小帮助程序来减轻从 System::Action/Func 转换为 C++ 可调用文件的痛苦。这是一个专业的例子。

template<> struct Callable<void()> {
    Callable(System::Action^ f) : func(std::move(f)) {}
    Handle<System::Action> func;
    void operator()() {
        System::Action^ f = *func;
        f();
    }
};

但是,这段代码无法编译。它告诉我 System::Action::Invoke 无法访问,无法调用。

如何从 C++/CLI 调用 System::Action

使用 msclr::gcroot 在本机类型中保存跟踪指针。

这段代码在 VS2013 上编译得很好:

#include <msclr\gcroot.h>

struct CallableAction
{
    msclr::gcroot<System::Action^> func;
    CallableAction(System::Action^ f) : func(f) {}
    void operator()()
    {
        func->Invoke();
    }
};

作为模板它应该也能正常工作,我只是对其进行了简化,这样我就不必担心它是否被正确实例化并进行了全面的错误检查。

这似乎是编译器简单地误报了问题,这实际上是在另一个正在实例化的专门化中,其中参数是 System::Action 无法处理的本机类型。我不知道为什么它选择给我问题中的错误而不是实际错误。