P/Invoke funkcja ze wskaźnikiem na funkcje

0

Napisałem dllke w c++ i w niej jest coś mniej więcej takiego:

__declspec(dllexport) void setFuncProc(bool(*_func)(unsigned long long s, char* buf))

W jaki sposób mogę to wywołać w c#?
Próbowałem tak:

delegate bool FuncProc(long s, [In, MarshalAs(UnmanagedType.LPStr)] string buf);
[DllImport("dllka.dll", CharSet = CharSet.Ansi)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern void setFuncProc(FuncProc proc);

Ale niestety gdy funkcja, której adres podałem w argumencie, próbuje zostać wywołana w dllce, pojawia się błąd "acces violating".
Z góry dziękuje za pomoc.

1

[return: MarshalAs(UnmanagedType.Bool)]

Twoja funkcja przecież niczego nie zwraca.

Dopasuj konwencje wywołania swojej eksportowanej funkcji oraz tego callbacku. Domyślnie C# przy marshallingu uzna, że to stdcall, a w C/C++ na x86 domyślną dla VS jest cdecl.

Konwencję dla delegaty ustawiasz przez atrybut [UnmanagedFunctionPointer(CallingConvention.Cdecl)], a dla samej funkcji CallingConvention = CallingConvention.Cdecl w DllImport.

1

poza tym co @Rev napisał:

  • zamieniłeś unsigned long long na long — trochę konsekwencji może jednak: ulong.
  • bool to UnmanagedType.I1, a nie UnmanagedType.Bool.
  • co prawda to nie błąd, ale staraj się nie zmieniać nazw parametrów. zmieniłeś parametr _func na proc.
  • czy przypadkiem ten char* w C++ nie powinien być const? bo jeśli nie, to teraz nie wiadomo czy robić z niego C#-owego stringa czy nie.

Nie sprawdzane: (wywaliłem co nadmiarowe)

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
[return: MarshalAs(UnmanagedType.I1)]
delegate bool FuncProc(ulong s, string buf);

[DllImport("dllka.dll", CallingConvention = CallingConvention.Cdecl)]
extern static void setFuncProc(FuncProc _func);

PS. a tak w ogóle, zamiast takich karkołomnych importów, napisz tę DLLkę w C++/CLI i eksportuj normalną klasę dla C#.

PSS. istotne jest, żebyś projekt w C# ustawił na konkretną architekturę (x86 albo x64), nie może być AnyCPU.

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