Skip to content

Commit a340661

Browse files
committed
Fix GCHandle.Alloc blittability issue by using IntPtr arrays
Changed void*[] and int*[] arrays to IntPtr[] arrays because pointer arrays are not blittable and cannot be pinned with GCHandleType.Pinned on .NET 6. IntPtr is blittable and works correctly across all .NET versions.
1 parent 0ac9041 commit a340661

File tree

1 file changed

+10
-8
lines changed

1 file changed

+10
-8
lines changed

language-extensions/dotnet-core-CSharp/src/managed/CSharpOutputDataSet.cs

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,16 @@ public class CSharpOutputDataSet: CSharpDataSet
2929
private List<GCHandle> _handleList = new List<GCHandle>();
3030

3131
/// <summary>
32-
/// An array of int pointers containing strLenOrNullMap for each column.
32+
/// An array of IntPtr containing strLenOrNullMap pointers for each column.
33+
/// IntPtr is blittable and can be pinned with GCHandle.
3334
/// </summary>
34-
private unsafe int*[] _strLenOrNullMapPtrs;
35+
private IntPtr[] _strLenOrNullMapPtrs;
3536

3637
/// <summary>
37-
/// An array of void pointers containing data for each column.
38+
/// An array of IntPtr containing data pointers for each column.
39+
/// IntPtr is blittable and can be pinned with GCHandle.
3840
/// </summary>
39-
private unsafe void*[] _dataPtrs;
41+
private IntPtr[] _dataPtrs;
4042

4143
/// <summary>
4244
/// This method extracts metadata and actual data for each column supplied
@@ -45,8 +47,8 @@ public class CSharpOutputDataSet: CSharpDataSet
4547
public unsafe void ExtractColumns(DataFrame dataFrame)
4648
{
4749
Logging.Trace("CSharpOutputDataSet::ExtractColumns");
48-
_strLenOrNullMapPtrs = new int*[ColumnsNumber];
49-
_dataPtrs = new void*[ColumnsNumber];
50+
_strLenOrNullMapPtrs = new IntPtr[ColumnsNumber];
51+
_dataPtrs = new IntPtr[ColumnsNumber];
5052
for(ushort columnNumber = 0; columnNumber < ColumnsNumber; ++columnNumber)
5153
{
5254
DataFrameColumn column = dataFrame.Columns[columnNumber];
@@ -123,7 +125,7 @@ DataFrameColumn column
123125
Logging.Trace("CSharpOutputDataSet::ExtractColumn");
124126
int[] colMap = GetStrLenNullMap(columnNumber, column);
125127
GCHandle colMapHandle = GCHandle.Alloc(colMap, GCHandleType.Pinned);
126-
_strLenOrNullMapPtrs[columnNumber] = (int*)colMapHandle.AddrOfPinnedObject();
128+
_strLenOrNullMapPtrs[columnNumber] = colMapHandle.AddrOfPinnedObject();
127129
_handleList.Add(colMapHandle);
128130

129131
// Use the data type already determined in ExtractColumns (which preserves nvarchar/varchar distinction)
@@ -206,7 +208,7 @@ T[] array
206208
) where T : unmanaged
207209
{
208210
GCHandle handle = GCHandle.Alloc(array, GCHandleType.Pinned);
209-
_dataPtrs[columnNumber] = (void*)handle.AddrOfPinnedObject();
211+
_dataPtrs[columnNumber] = handle.AddrOfPinnedObject();
210212
_handleList.Add(handle);
211213
}
212214

0 commit comments

Comments
 (0)