Отображение P / Invoke для сложной функции C (const void * text) - PullRequest
1 голос
/ 26 августа 2011

Я пытаюсь создать оболочку для библиотеки синтеза речи eSpeak, и до сих пор мне удавалось сделать простые методы, такие как односимвольный синтез. Тем не менее, основной метод синтеза слишком сложен для меня, чтобы обернуть голову. У кого-нибудь есть хорошее предложение для отображения C # сигнатуры этого метода? (Особенно первая переменная!)

ESPEAK_API espeak_ERROR espeak_Synth(const void *text,
    size_t size,
    unsigned int position,
    espeak_POSITION_TYPE position_type,
    unsigned int end_position,
    unsigned int flags,
    unsigned int* unique_identifier,
    void* user_data);

espeak_POSITION_TYPE Я сопоставлен с перечислением, и я думаю, что это работает. Ниже приведено описание текстовой переменной, если это полезно:

text: The text to be spoken, terminated by a zero character. It may be either 8-bit characters,
  wide characters (wchar_t), or UTF8 encoding.  Which of these is determined by the "flags"
  parameter.

1 Ответ

1 голос
/ 26 августа 2011

Это зависит.

при условии, что espeak_ERROR и espeak_POSITION_TYPE являются целыми числами:

[DllImport("...", CharSet=CharSet.Ansi)
static extern int espeak_Synth(string text,
    int text_length,
    int position,
    int position_type,
    int end_position,
    int flags,
    IntPtr unique_identifier,
    IntPtr user_data);

это должно работать, если вы перейдете к флажкам, этот текст будет 8-битным (а не UTF).

[DllImport("...")
static extern int espeak_Synth(IntPtr text,
    int text_length,
    int position,
    int position_type,
    int end_position,
    int flags,
    IntPtr unique_identifier,
    IntPtr user_data);
                                   // vv this can be some parameter
byte[] dat = Encoding.UTF8.GetBytes("some utf-8 string"             + "\0"); // note the trailing '\0'!
IntPtr pnt = Marshal.AllocHGlobal(dat.Length);
try {
    Marshal.Copy(dat, 0, pnt, dat.Length);
    espeak_Synth(pnt, dat.Length, .....); // assuming the text_length is in bytes. If in octets, pass the string's length
}
finally
{
    Marshal.FreeHGlobal(pnt);
}

если вы хотите передать строку UTF-8.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...