2010-01-03 3 views
7

En C# PInvoke, comment je passe un tampon de chaîne de sorte que la DLL C le remplit et retourne? Quelle sera la déclaration PInvoke?C# PInvoke out déclaration de chaînes

La déclaration de fonction C est

int GetData(char* data, int buflength); 

En C#, je l'ai déclaré comme

[DllImport(DllName)] 
static extern Int32 GetData([MarshalAs(UnmanagedType.LPStr)]StringBuilder receiveddata, Int32 buflen); 

est-il exact? Je passe la variable StringBuilder comme ceci

int bufferLength = 32; 
StringBuilder data = new StringBuilder(bufferLength); 
int result = GetData(data, bufferLength); 

Je voudrais savoir si c'est correct ou pas?

Merci

+0

Il est correct si cela fonctionne. Il n'y a pas de raison évidente que ça ne marche pas. –

Répondre

7

Je crois que c'est correct.

[DllImport(DllName)] 
static extern int GetData(StringBuilder data, int length); 

qui est appelé comme ceci:

StringBuilder data = new StringBuilder(32); 
GetData(data, data.Capacity); 

Une fois, je voulais avoir plus de contrôle sur les octets renvoyés par ma fonction et a fait comme ceci:

[DllImport(DllName)] 
private unsafe static bool GetData(byte* data, int length); 

utilisé comme celui-ci :

byte[] bytes = new byte[length]; 

fixed(byte* ptr = bytes) 
{ 
    bool success = Library.GetData(ptr, length); 

    if (!success) 
    Library.GetError(); 

    return Encoding.UTF8.GetString(bytes); 
} 
3

Je fais ne pense pas que l'utilisation MarshalAs attribut nécessaire ici. StringBuilder est un bon choix pour char * out.

Je suppose que ce sera bien d'ajouter la propriété CharSet car vous avez affaire à des chaînes ici.

Comme ceci:

[DllImport(DllName, CharSet=CharSet.Auto)]