P / Invoke EntryPointNotFoundException при попытке выделить контейнеры указателя - PullRequest
0 голосов
/ 23 ноября 2010

Я пытаюсь вызвать DllImport для следующей функции Alsa (из документации :

#define snd_seq_client_info_alloca( ptr )  __snd_alloca(ptr, snd_seq_client_info)

выделить контейнер snd_seq_client_info_t в стеке

Вот реализация, которую я нашел в C ++ при чтении кода приложения , аналогичного тому, что я хочу выполнить в Mono:

snd_seq_client_info_t* cinfo;
snd_seq_client_info_alloca(&cinfo);

И вот что у меня естьпока, но это не работает:

[DllImport(libasound.so.2)]
private static extern void snd_seq_client_info_alloca(out IntPtr ptr);

internal static void MyFunction ()
{
    IntPtr clientInfo = IntPtr.Zero;
    snd_seq_client_info_alloca(out clientInfo);
    // and then some more ...
}

Но я получаю следующее исключение:

System.EntryPointNotFoundException: snd_seq_client_info_alloca
at (wrapper managed-to-native)   
MonoMultiJack.ConnectionWrapper.Alsa.LibAsoundWrapper:snd_seq_client_info_alloca (intptr&)

1 Ответ

3 голосов
/ 23 ноября 2010

snd_seq_client_info_alloca - макрос препроцессора. Вы не можете P / Invoke макросы препроцессора, только правильно экспортированные функции.

snd_seq_client_info_alloca расширяется до __snd_alloca, который также является макросом препроцессора.

__snd_alloca существенно расширяется до вызова alloca. Вы можете попробовать переписать это в C #. Но я считаю, что не имеет смысла выделять память в кадре стека вызывающей стороны, если вызывающей стороной является управляемый код.

Просто выделите немного памяти где-нибудь еще (например, используя Marshal.AllocHGlobal ).

...