je la méthode suivante: définiecaractères NUL de Marshal.Copy en C#
internal string GetInformation(string recordInformation)
{
int bufferSize = GetBufferSize(recordInformation);
string outputRecord;
IntPtr output = Marshal.AllocHGlobal(bufferSize);
try
{
_returnCode = UnmanagedMethod(recordInformation, output, recordInformation.Length);
byte[] outputData = new byte[bufferSize];
Marshal.Copy(output, outputData, 0, bufferSize);
outputRecord = ASCIIEncoding.ASCII.GetString(outputData, 0, bufferSize);
}
finally
{
Marshal.FreeHGlobal(output);
}
return outputRecord;
}
Dans cette méthode, une chaîne fournie (recordInformation) est passé à une méthode écrite en C (UnmanagedMethod). Basé sur la documentation que j'ai pour cette méthode, le bufferSize est configuré correctement; Toutefois, Marshal.Copy crée un tableau de la taille de recordInformation.Length à la place. Lorsque j'ai affecté le rayon à la variable outputRecord, le contenu de la chaîne est la longueur de la bufferSize; cependant, il existe un certain nombre de NUL (Char 0) pour remplir le reste de la chaîne jusqu'à ce qu'elle atteigne le champ recordInformation.Length. Si je change le dernier paramètre de la liste de paramètres UnmanagedMethod en bufferSize, la chaîne de sortie ne se transforme en rien d'autre que des caractères NUL. Est-ce que je fais le marshaling mal ou est-il un moyen après la chaîne a été créée du tableau d'octets pour enlever les caractères NUL?
Merci
Quelle méthode non gérée utilisez-vous? Il est difficile de dire quelle serait la meilleure façon d'être maréchal sans pouvoir lire les spécifications autochtones. Est-ce une méthode API, ou quelque chose de personnalisé? –
La méthode non managée est une méthode d'une API tierce. La documentation de l'API est tout en C et la signature de la méthode (en C) est 'int UnmanagedMethod (char * inputstring, char * sortiestring, int inputlength)'. La chaîne outputRecord est créée correctement autre que les caractères NUL à la fin de la chaîne. – JamesEggers
J'ai demandé à l'API tierce partie et ils ne connaissent pas C# et ne sont pas en mesure de fournir autre chose qu'un exemple non-travail/non-compilation. – JamesEggers