我必须传递一个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 *
失败。
感谢。