Copier des données à partir de IntPtr à IntPtr
J'ai deux IntPtr
valeurs pointant vers certaines zones de données de length
octets. length
peut avoir un ordre de grandeur de 200 à 400.
int length = /* ..*/
IntPtr ptrSrc = /*.. */;
IntPtr ptrDst = /* .. */;
Maintenant je veux copier les données à partir de ptrSrc
à ptrDst
. Ce code fonctionne:
byte[] data = new byte[length];
Marshal.Copy(ptrSrc, data, 0, length);
Marshal.Copy(data, 0, ptrDst, length);
mais il a l'inconvénient d'avoir besoin temporaire supplémentaire (potentiellement énorme) tableau. Malheureusement, je ne pouvais pas trouver un Marshal.Copy
variante dans le .NET framework pour copier directement à partir de IntPtr
à IntPtr
, je suis à la recherche de solutions de rechange.
Je suis intéressé par une solution qui fonctionne sur Windows 32 comme 64 bits de Windows. Des suggestions?
- Pouvez-vous utiliser
unsafe
? - oui, c'est possible.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez P/Invoke dans le cas C de la fonction. C'est probablement la meilleure façon de le faire. Exemple:
memcpy
copies octets, donc il n'y a pas de pointeur de la taille ou de limite de mot de problèmes. C# marhsalling prendrons soin de la droite la taille du pointeur de la sous-fonction C.msvcrt.dll
sera disponible sur la plupart des systèmes, mais si vous voulez être sûr, vous aurez besoin de distribuer avec votre application.CopyMemory
dekernel32.dll
.IntPtr
etUintPtr
sont toujours la taille d'un pointeur (32 bits (x86, 64 bits x64), vous pourriez résoudre l'exactitude problème en faisant de lacount
paramètre unUIntPtr
et puis coulée dans l'appel.Je pense que la réponse nécessite une mise à jour .net 4.6 il y a
Cette méthode copie sourceBytesToCopy octets à partir de l'adresse spécifiée par la source à l'adresse indiquée par destination. Si le chevauchement des tampons et de la différence entre les destinations moins source est inférieure à sourceBytesToCopy, le bloc de la source est copié dans le bloc de destination dans l'ordre inverse.
Donc, si vous n'êtes pas sur de 4,6 ou universal app windows 10 ensuite, utilisez la réponse précédente.
unsafe
bloc de code de travail.Comme user38000527 souligne la réponse moderne est MemoryCopy et elle est partie .NET core 1.0, .NET la norme 1.3, et .NET framework 4.6.
Ici est de savoir comment vous l'utilisez dans votre contexte: