I have a C# generic function. Try to copy unmanaged array data to managed array:
static void CopyToManagedArray<T>(IntPtr ptrManagedArray, IntPtr ptrNativeArray, int startIndex, int length)
{
var handle = GCHandle.FromIntPtr(ptrManagedArray);
T[] managedArray = handle.Target as T[];
// public static void Copy (IntPtr source, int[] destination, int startIndex, int length);
// Copies data from an unmanaged memory pointer to a managed 32-bit signed integer array.
Marshal.Copy(ptrNativeArray, managedArray, startIndex, length);
}
I checked https://docs.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.marshal.copy?view=net-6.0#system-runtime-interopservices-marshal-copy(system-intptr-system-int32()-system-int32-system-int32). The parameters matched, but why I got compiling errors even without calling this generic function?
error CS1503: Argument 1: cannot convert from 'System.IntPtr' to 'byte[]'
error CS1503: Argument 2: cannot convert from 'T[]' to 'int'
error CS1503: Argument 3: cannot convert from 'int' to 'System.IntPtr'
What I want to do here is in native C++ code, to copy a native array elements to a managed array. In native code, I have some functions:
struct Context
{
void CopyToManagedIntArray(void* ptrManagedArray, int* nativeArray, int startIndex, int length);
void CopyToManagedDoubleArray(void* ptrManagedArray, double* nativeArray, int startIndex, int length);
};
In C# code, I have marshaled the struct Context and try to implement these functions. Since they are similar, so I want to use a generic function to implement them:
[StructLayout(LayoutKind.Sequential)]
struct Context
{
void CopyToManagedIntArray(IntPtr ptrManagedArray, IntPtr nativeArray, int startIndex, int length)
{
CopyToManagedArray<int>(ptrManagedArray, nativeArray, startIndex, length);
}
void CopyToManagedDoubleArray(IntPtr ptrManagedArray, IntPtr nativeArray, int startIndex, int length)
{
CopyToManagedArray<Double>(ptrManagedArray, nativeArray, startIndex, length);
}
}