В делегате нет ничего неуправляемого. Фактически это управляемый и объектно-ориентированный дружественный эквивалент (на некоторых стероидах) указателя базовой функции.
В этом контексте объявляет тип делегата (с указанием аргументов функции и возвращаемого типа). Затем вы можете создавать экземпляры этого делегата (почти так же, как экземпляры типа), которые ссылаются на конкретные функции.
базовый пример:
public delegate int AddSomething(int x);
public class Foo
{
public static void Main(string[] args)
{
// the following are equivalent
AddSomething add1 = Foo.PlusAnything;
AddSomething add1alt = new AddSomething(Foo.PlusAnything);
Console.WriteLine(add1(5)); // prints "6"
// instance delegates, bound to a method on a particular instance
AddSomething add3 = new Foo(3).AddAnything;
AddSomething add5 = new Foo(5).AddAnything;
Console.WriteLine(add3(4)); // prints "7"
Console.WriteLine(add5(6)); // prints "11"
}
static int PlusOne(int x) { return x+1; }
private int y;
public Foo(int toAdd) { this.y = toAdd; }
int PlusAnything(int x) { return x+this.y; }
}
IntPtr - это управляемый способ работы с чем-то похожим на пустоту * (указатель на что-либо), но с четко определенным размером, зависящим от платформы (таким образом, 32 бита на 32-битной платформе) и 64 бита на 64-битной платформе).
Обычно используется, когда необходимо хранить ссылку на некоторый произвольный неуправляемый ресурс (например, собственный дескриптор файла, указатель на некоторый буфер в неуправляемом коде или указатель на некоторый объект или структуру, расположенную в неуправляемой куче) , Часто взаимодействие с неуправляемым кодом таким образом называется взаимодействием, а общий механизм (и тот, что у вас есть выше) называется P / Invoke.
Рассматриваемый здесь делегат определяет для удобства управляемого ocde и взаимодействия сигнатуру обратного вызова, которая происходит для перехвата клавиатуры. Он описывает некоторые аспекты того, как вещи будут преобразованы в их управляемые эквиваленты. Делая это таким образом, ваша управляемая функция (которая может перемещаться в памяти) может быть передана в некоторый неуправляемый код, потому что среда выполнения знает, что это происходит, и гарантирует, что происходит правильно. За кулисами происходит довольно много «магии», так что все это может работать правильно, но от разработчика (то есть вас) все еще ожидают, что значат соответствующие указатели и что вы должны с ними делать.
при попытке понять, как использовать неуправляемые функции в win32, P / Invoke wiki очень полезна. Вы пример для UnhookWindowsHookEx , который подробно описывает, как вызвать эту функцию. Вы все еще должны знать, что делает действительная функция и как она работает.
Незнание того, что делать с IntPtr, не является серьезной проблемой, но если вы не знаете, что такое делегат, у вас есть серьезные знания о c # /. Net, которые нужно сделать, прежде чем вы приблизитесь к этой базе кода.