2010-05-06 6 views
0

J'ai deux fonctions C++ non managées, Compress et Decompress. Les arguments et les retours vont comme suit:Comment faire pour envelopper deux fonctions C++ non managées en deux fonctions C# managées?

unsigned char * Compress (unsigned char *, int)

unsigned char * Decompress (unsigned char *, int)

Lorsque tous uchars sont des tableaux de uchars.

Est-ce que quelqu'un pourrait m'aider à trouver un moyen de les convertir en code C# géré en utilisant le tableau Byte [] au lieu de char * non signé? Merci beaucoup!

+1

Pas clair: voulez-vous a) réinventer les fonctions, b) écrire des wrappers pour les managé C++, ou c) les compiler dans une DLL non géré et les appeler à partir .NET utilisant P/Invoke? –

+0

Géré et non géré sont redondants sur le titre de la question. Ce que vous avez est deux fonctions C++ que vous avez besoin d'envelopper dans C# – Panic

+0

Je voudrais les appeler à partir de .NET en utilisant P/Invoke, je suis désolé de ne pas clarifier assez bien. – Gbps

Répondre

1

Vous devriez être en mesure de transmettre le paramètre char * non signé dans un octet [] et le standard P/Invoke marshaller devrait gérer cela. Vous devrez rassembler vous-même la sortie non signée char *, mais cela devrait juste être un appel à Marshall.Copy(). Voir ci-dessous pour un exemple de ce que je pense fonctionnera.

Deux grandes questions:

  1. Comment l'appelant que la taille des données stockées dans le retour unsigned char * tampon?
  2. Comment la mémoire est-elle allouée pour le retour du tampon char * non signé? Avez-vous besoin de le libérer et comment allez-vous le libérer de C# si vous en avez besoin?

Exemple:

[DllImport("Name.dll")] 
    private static extern IntPtr Compress([MarshalAs(UnmanagedType.LPArray)]byte[] buffer, int size); 

    [DllImport("Name.dll")] 
    private static extern IntPtr Decompress([MarshalAs(UnmanagedType.LPArray)]byte[] buffer, int size); 

    public static byte[] Compress(byte[] buffer) { 
     IntPtr output = Compress(buffer, buffer.Length); 
     /* Does output need to be freed? */ 
     byte[] outputBuffer = new byte[/*some size?*/]; 
     Marshal.Copy(output, outputBuffer, 0, outputBuffer.Length); 
     return outputBuffer; 
    } 

    public static byte[] Decompress(byte[] buffer) { 
     IntPtr output = Decompress(buffer, buffer.Length); 
     /* Does output need to be freed? */ 
     byte[] outputBuffer = new byte[/*some size?*/]; 
     Marshal.Copy(output, outputBuffer, 0, outputBuffer.Length); 
     return outputBuffer; 
    } 
+0

Merci! Cela devrait fonctionner correctement pour l'instant, j'ai quelques fonctions qui peuvent obtenir la taille de la sortie décompressée ainsi que la sortie compressée. Ma seule autre question est de savoir comment je vais libérer la sortie en C#. – Gbps