Przekazywanie funckji jako argumentu w C# - jak?

0

Witam napisałem sobie dll'ke z funkcją typu:

 typedef void(*RecordingFNC)( unsigned char *audioData, unsigned long lengthInBytes );
RecordingFNC MRecFNC;
void DLL_EXPORT REC_START(RecordingFNC F)
{
    MRecFNC=F;
    recorder->startRecordingCustomHandledAudio(SampleREC);
}

I teraz po zaimportowaniu tego w C#

[DllImport("IrrKlangWrapDLL.dll", EntryPoint = "REC_START")]
        public extern static bool REC_START(/*jaki tutaj wpisać parametr??*/);

jak mam zrobić, aby przekazać w C# funkcje która ma być wywoływane w tej dll'ce? ogólnie jest to możliwe? jak to zrobić?
tzn jak wpisać parametr tej funkcji?
żebym w C# mógł zrobić:

void MFNC(byte[] data,int len){... }
REC_START(MFNC);

dziękuje za pomoc.

0

Dzięki!! działa, pomogło coś takiego:

       [UnmanagedFunctionPointer(System.Runtime.InteropServices.CallingConvention.Cdecl)]
        public delegate void IrrKlangDataCallDelegate(byte[] T, int L);
        [DllImport("IrrKlangWrapDLL.dll", EntryPoint = "REC_START", CallingConvention = CallingConvention.Cdecl)]
        public extern static void REC_START([MarshalAs(UnmanagedType.FunctionPtr)]IrrKlangDataCallDelegate functionCallback);
        [DllImport("IrrKlangWrapDLL.dll", EntryPoint = "CreateDevice")]public extern static bool CreateDevice();

 private void IrrKlangDataCall(byte[] T, int L)
        {
            Debug.Print("CRC:{0}", L);
        }
REC_START(new IrrKlangDataCallDelegate(IrrKlangDataCall));
 

A jeszcze jedno pytanie czy zamiast IntPtr mogę użyć byte[] bez obaw , że coś się wysypie w IrrKlangDataCallDelegate(byte[] T, int L)?

0

cool, tak mozesz przekazac byte[], bedzie ok

0

dla zwiększenia wydajności dodaj [Out] albo [In] przed tablicą, zależnie od tego w którą stronę są kopiowane dane (z funkcji czy do funkcji)

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void IrrKlangDataCallDelegate([In] byte[] T, int L);

1 użytkowników online, w tym zalogowanych: 0, gości: 1