2010-11-22 5 views
0

dem Versuch, eine DllImport auf der folgenden Alsa Funktion aufrufen (vom documentation:P/Invoke EntryPointNotFoundException beim Versuch, pointer Behälter zuzuteilen

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

einen auf Stapel snd_seq_client_info_t Behälter zuzuteilen

Hier ist eine Implementierung, die ich in C++ beim Lesen des Codes von application ähnlich zu dem, was ich in Mono erreichen möchte:

snd_seq_client_info_t* cinfo; 
snd_seq_client_info_alloca(&cinfo); 

Und hier ist, was ich habe, so weit, aber es funktioniert nicht:

[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 ... 
} 

Aber ich bekomme die folgende Ausnahme:

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

Antwort

3

snd_seq_client_info_alloca ist ein Pre-Prozessor-Makro. Sie können Pre-Prozessor-Makros nicht aufrufen, nur ordnungsgemäß exportierte Funktionen.

snd_seq_client_info_alloca erweitert auf __snd_alloca, die auch ein Präprozessor-Makro ist.

__snd_alloca erweitert sich im Wesentlichen zu einem Aufruf an alloca. Sie könnten versuchen, dies in C# umzuschreiben. Aber ich glaube, dass es nicht viel Sinn macht, Speicher im Stapelrahmen des Aufrufers zuzuweisen, wenn der Aufrufer ein verwalteter Code ist.

Ordnen Sie einfach etwas Speicherplatz an anderer Stelle zu (z. B. mit Marshal.AllocHGlobal).

+0

'EntryPointNotFoundException' und' # define'. Oh, manchmal übersieht man einfach das Offensichtliche. Vielen Dank. Zumindest kompiliert es jetzt, ich muss nur den Bibliothekscode nach der Größe des zu reservierenden Speichers durchsuchen. – Residuum

+1

Wenn Sie eigentlichalloc von C# stacken möchten, können Sie auch das Schlüsselwort stackalloc verwenden: int * block = stackalloc int [100]; –