Question

J'essaie d'utiliser une DLL tierce qui souhaite un int ** comme l'un des paramètres de la méthode. Il décrit le paramètre comme l'adresse du pointeur qui pointera sur l'allocation de mémoire.

Désolé pour toute confusion. Le paramètre est à double sens je pense. La DLL permet de communiquer avec une carte FPGA et la méthode consiste à configurer le transfert DMA entre le PC hôte et la carte PCI.

Était-ce utile?

La solution

Utilisez une référence par défaut System.IntPtr .

 [DllImport("thirdparty.dll")]
 static extern long ThirdPartyFunction(ref IntPtr arg);

 long f(int[] array)
  { long retval = 0;
    int  size   = Marshal.SizeOf(typeof(int));
    var  ptr    = IntPtr.Zero;

    try 
     { ptr = Marshal.AllocHGlobal(size * array.Length);

       for (int i= 0; i < array.Length; ++i) 
        { IntPtr tmpPtr = new IntPtr(ptr.ToInt64() + (i * size));
          Marshal.StructureToPtr(array, tmpPtr, false);
        }

       retval = ThirdPartyFunction(ref ptr);
     }
    finally 
     { if (ptr != IntPtr.Zero) Marshal.FreeHGlobal(ptr);
     }

    return retval;
  }

Autres conseils

Vous devrez utiliser la classe Marshal ou vous rendre dangereux dans ce cas.

Il peut également s'agir simplement d'un pointeur sur un tableau. Ainsi, une ref int [] liste pourrait fonctionner.

Un int ** serait un tableau de IntPtr, d'après votre description, vous voudrez peut-être envisager d'utiliser C ++ / CLI pour vous aider avec les conversions, par exemple d'un int ** non géré vers un tableau géré ^ > ^

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top