2012-03-27 14 views
1

ich eine Funktion wie diese Schrift: von C#zu einem Array C# aus C mit PInvoke habe

extern "C" __declspec(dllexport) void Step(int * oSamplesCount, float * oSamples){ 
    // (approximative syntax for clarity) 
    *oSamplesCount = new_samples_count (some number between 0 and 16000) 
    oSamples[ 0 .. new_samples_count ] = some floats (sound data) 
} 

Ich mag es nennen:

richtig genannt
float [] mSamples = new float[16000]; 

[DllImport("Lib.dll")] 
static extern void Step(ref Int32 oSamplesCount, [MarshalAs(UnmanagedType.LPArray,SizeConst=16000)] ref float [] oSamples); 

void update(){ 
    Int32 lSamplesCount = 0; 
    Step(ref lSamplesCount, ref mSamples); 
} 

Die C-Funktion ist, Die FOR() -Schleife, die das Samples-Array füllt, ist in Ordnung, aber es stürzt irgendwo zwischen der Rückkehr und der nächsten C# -Zeile ab, also habe ich etwas mit Unmarshalling zu tun, obwohl ich kein Marshalling/Unmarshalling (das Array) möchte ist blitable und muss geschrieben werden von C)

Ich kann nicht/unsicher verwenden. Ich habe versucht SizeConst und verschiedene andere Permutationen.

Jede Hilfe wird geschätzt!

Antwort

1

Ihr Pinvoke ist falsch. Der Array-Parameter sollte nicht von ref übergeben werden, da eine float[] bereits eine Referenz ist. Machen Sie es wie folgt aus:

[DllImport("Lib.dll")] 
static extern void Step(ref Int32 oSamplesCount, float[] oSamples); 

Beachten Sie, dass diese von zu verwaltenden nativen Marschall wird, und wieder zurück, alle 16000 Werte, bei jedem Aufruf von Step. Wenn das zu teuer ist, denke ich, dass Sie ein manuelles Marshalling durchführen müssen.

+0

Sie haben Recht, Float [] ist bereits eine Referenz. Das war mein Fehler. Aber wenn ich UnmanagedType.LPArray verwende, wird es immer noch die 16000 Floats Marshall/Unmarshall? – Calvin1602

+0

Ja wird es. Das Standard-Marshalling für 'float []' ist 'UnmanagedType.LPArray', so dass Sie das nicht angeben müssen. Ihre Schnittstelle ist sehr merkwürdig. Der native Code hängt jedes Mal an. Ich würde das wahrscheinlich mit AllocHGlobal tun und dann alle Floats am Ende in einen 'float []' kopieren, sobald ich mit dem 'Step' fertig bin. –