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 genanntfloat [] 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!
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
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. –