函数回调处理程序无法将完整的float数组从CLI / C ++传递给C#

时间:2017-10-16 16:19:50

标签: c# c++ callback c++-cli

我必须传递一个float数组作为函数回调处理程序的参数。 float数组(图像数据)将在C ++端生成,C#代码可以接收数组。我当前的代码只将第一个元素array[0]传递给C#。

我在c ++代码中声明了这个处理程序

class ArrayHandler { 
    public:

    typedef void(*ImageHandler) (float *img, int size, char *msg);

    ArrayHandler();
    ~ArrayHandler();

    void Hello(ImageHandler);

private:
    ImageHandler m_imgHandler;
};

成员函数Hello(ImageHandler)的实现是

void ArrayHandler::Hello(ImageHandler h)
{
    m_imgHandler = h;
    int size = 5;
    char *msg = "Hello";
    float arry[5] {1, 2, 3, 4, 5};

    m_imgHandler(arry, 5, msg);
}


在CLI / C ++包装器中,我将ImageHandler声明为

delegate void ImageHandler(cli::array<float>^ img, int size, String ^msg);

包装器中Hello(ImageHandler ^ih)的实现是

void WrappedHandler::Wrapped::Hello(ImageHandler ^ih)
{
    wrapped_ImageHandler = ih;
    IntPtr ip = 
    Marshal::GetFunctionPointerForDelegate(wrapped_ImageHandler);

    ArrayHandler::ImageHandler nativeHandler = 
    reinterpret_cast<ArrayHandler::ImageHandler>(ip.ToPointer());

    m_ArrayHandler->Hello(nativeHandler);
}


我使用以下命令在C#中调用该函数。

class Program
{
    static void Main(string[] args)
    {
        Wrapped test = new Wrapped();
        test.Hello(ImageFromHandler);
    }

    private static void ImageFromHandler(float[] img, int size, string msg)
    {
        Console.WriteLine(msg);
        int l = img.Length;
        if(l != size){
            Console.WriteLine("Size not match");
        }
    }
}

我运行程序,我发现传递给C#的float数组的大小是1,只传递了第一个元素。然后我尝试了一些不直观的东西,例如传递一个float数组的数组,但程序因某些原因而中断。我认为当我将处理程序编组为本机指针时可能会出现问题。我也很困惑,可以传递在c ++中声明为char *的字符串类型参数,但float *失败。

感谢。

0 个答案:

没有答案