Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p>I have been able to pass a C# jagged array to C++ via an external Pinvoke method without using unsafe C# code as in the code sample below. But I still have my concerns regarding the GC in non-debug mode causing side undesirable side-effect. Here's the piece of test code (that works in debug mode):</p> <pre><code>[Test, Ignore] public void Test_JaggedArrayPInvoke() { var jaggedArray = new int[3][]; jaggedArray[0] = new int[1] { 9 }; jaggedArray[1] = new int[4] { 1, 2, 3, 8 }; jaggedArray[2] = new int[2] { 1, 2 }; //GCHandle mainHandle = GCHandle.Alloc(jaggedArray, GCHandleType.Pinned); //This does not work var pinnedHandles = new GCHandle[3]; var jaggedArrayPtrs = new IntPtr[3]; for (int i = 0; i &lt; 3; i++) { pinnedHandles[i] = GCHandle.Alloc(jaggedArray[i], GCHandleType.Pinned); jaggedArrayPtrs[i] = pinnedHandles[i].AddrOfPinnedObject(); } var result = JaggedArrayPInvoke_TEST(jaggedArrayPtrs); Console.WriteLine(result); //returns 8 as it should. //mainHandle.Free(); for (int i = 0; i &lt; 3; i++) { pinnedHandles[i].Free(); } } //The C++ test method: extern "C" __declspec(dllexport) int __stdcall JaggedArrayPInvoke_TEST(int** jaggedArray); __declspec(dllexport) int __stdcall JaggedArrayPInvoke_TEST(int** jaggedArray) { return jaggedArray[1][3]; } </code></pre> <p>If I was to uncomment the mainHandle part, I get an argument exception "Object contains non-primitive or non-blittable data". <strong>So is it possible to pin the jaggedArray and is it really needed?</strong> (I vaguely recall that GC in release mode may recollect memory already within methods if it is not used any longer.) I think though that turning the jaggedArray into a class field variable instead would make it safe from a GC perspective.</p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload