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:
- Comment l'appelant que la taille des données stockées dans le retour unsigned char * tampon?
- 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;
}
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? –
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
Je voudrais les appeler à partir de .NET en utilisant P/Invoke, je suis désolé de ne pas clarifier assez bien. – Gbps