5
Answers

Passing an array of bytes from C++ to C#

jmales

jmales

20y
8.1k
1
Hi All, I am trying to write a C# program to call a routine in managed C++. In the routine, the C# program passes a delegate to the managed C++. The delegate looks like this in c++: public __delegate void FoundPidDelegate ( unsigned char pData __gc[], ); My C# routine looks like this: static private void MyFoundPidFunction (byte []pData) The C++ program should call the delegate and pass it an array of bytes (or at least the address of an array of bytes). In C++ I am allocating the memory like this: unsigned char arrManaged __gc [] = new unsigned char __gc[iDataLen]; Then I call the C# delegate routine like this: m_pFoundFunc(arrManaged); When I arrive back in my C# program, the pData array only has ONE element (a correct one) and if I try to look at pData[1], I get an error. What am I doing wrong? Thanks! Josh
Answers (5)
0
John Arcadella

John Arcadella

NA 345 226.5k 20y
Hi Josh, I think you would find the following article by Paul DiLascia useful: http://msdn.microsoft.com/msdnmag/issues/03/02/CQA/default.aspx Hope this help, MCB.
0
jmales

jmales

NA 5 0 20y
OK, I'll try to explain. I have an unmanaged C++ library that works with a piece of hardware. I wrote a managed C++ wrapper for the library. My main app is in C#. The hardware (library) raises an event in the unmanaged C++ . I want to call a routine in the GUI (C#). To do that I send a delegate from the C# program to the c++ program. The managed C++ wrapper gives me the ability to declare a reference in the C# program. I do not want to declare routines in external dll's. The delegate is called. That part works. The problem is that I can't get the C++ to pass the whole array over to the C#. Only the first element in the array seems to arrive. I once had this defined as unsafe code, and passed a *byte instead of []byte - and it worked. I was just trying to make this code safe. Hope this explains my intentions. Thanks for all your patience. Josh
0
bilnaad

bilnaad

NA 686 0 20y
For the record are talking C# or C++ here ^_^
0
jmales

jmales

NA 5 0 20y
Thanks, but I already got it to work with unsafe code. This is how it looked: typedef void __stdcall FoundPidFunction ( unsigned char *pData, } However, I want it to work with safe code. Am I asking too much from MS? Josh
0
bilnaad

bilnaad

NA 686 0 20y
maybe it's easier to use unsafe code. Let the unmanaged function return a pointer to the first byte in the array. Let that function take a parameter in wich to store the length of the array. Then you could use unsafe C# code to get the byte array. int length; byte* ptr = UnmanagedFunction(&length); byte[] bytes = new bytes[length]; for(int i = 0; i < length; i++) { bytes[i] = *(ptr+i); }