Маршалинг указателя метода с аргументом указателя в C # - PullRequest
3 голосов
/ 02 мая 2011

Мне нужно маршалировать указатель метода с аргументом указателя, как в C:

void (*callback)(int *x);

Как бы я написал это как поле структуры в C #?

Примечание: Я не против, чтобы CLR разыменовал указатель для меня.

1 Ответ

4 голосов
/ 02 мая 2011

Если ваш метод ожидает обратного вызова, принимающего указатель на любую структуру, вы можете передать управляемый обратный вызов при указании P / Invoke DllImports следующим образом:

private delegate void MyCallback(IntPtr par);

[DllImport("MyLibrary.dll")]
public static extern void SomeFunction(MyCallback callback);

Затем вы можете маршалировать IntPtr в соответствующую структуру внутри вашего фактического метода обратного вызова.

[Изменить]

Чтобы передать параметр int по ссылке, лучше всего подойдет следующая подпись делегата:

private delegate void MyCallback(ref int par);
...