Je suis en train d'écrire dll plugin qui doit mettre en œuvre la fonction suivante:Comment marshaler un pointeur vers un tableau de pointeurs vers des structures de code managé à non managé?
int GetFunctionTable(FuncDescStruct **ppFunctionTable);
donc mon code plugin en C# déclare ceci:
public static unsafe int GetFunctionTable(IntPtr functionTablePtr);
Cette fonction sera appelée et devrait remplir functionTablePtr avec pointeur sur un tableau de structures décrivant l'ensemble des fonctions de rappel.
En plaine C/C++, il ressemble à quelque chose comme:
// declare func table
// VExampleF1, VExampleF2 - are function pointers
FuncDescStruct funcTable[] = {
"ExampleF1", { VExampleF1, 0, 0, 0, 0, NULL }, //filling descriptions.
"ExampleF2", { VExampleF2, 1, 0, 1, 0, NULL }
};
int GetFunctionTable(FuncDescStruct **ppFunctionTable)
{
*ppFunctionTable = funcTable; // how to do this correctly in C#?
// must return the number of functions in the table
return funcTableSize;
}
Je suis en train de faire ce qui suit:
static unsafe FunctionTag[] funcTable;
static List<IntPtr> allocatedMemory;
public static unsafe int GetFunctionTable(IntPtr functionTablePtr)
{
//create just one test callback description
funcTable = new FunctionTag[1];
funcTable[0].Name = "VExampleF1";
funcTable[0].Description.Function = VExampleF1;
funcTable[0].Description.ArrayQty = 0;
funcTable[0].Description.FloatQty = 0;
funcTable[0].Description.StringQty = 0;
funcTable[0].Description.DefaultQty = 0;
funcTable[0].Description.DefaultValues = null;
// saving allocated memory for further cleanup
allocatedMemory = new List<IntPtr>();
int intPtrSize = Marshal.SizeOf(typeof(IntPtr));
IntPtr nativeArray = Marshal.AllocHGlobal(intPtrSize * funcTable.Length);
for (int i = 0; i < funcTable.Length; i++)
{
IntPtr nativeFD = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(FunctionTag)));
allocatedMemory.Add(nativeFD);
Marshal.StructureToPtr(funcTable[i], nativeFD, false);
Marshal.WriteIntPtr(nativeArray, i * intPtrSize, nativeFD);
}
Marshal.WriteIntPtr(functionTablePtr, nativeArray);
return funcTable.Length;
}
Ce code ne fonctionne pas, et la question est de savoir comment envoyer un pointeur vers un tableau de structures gérées pour une utilisation par du code non managé? Dans quelle direction dois-je aller?