alertDidEnd: Что такое Mono-эквивалент цели-C void*?

Я пытаюсь реализовать метод, основанный на Cocoa

- (void) alertDidEnd:(NSAlert *)alert returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo;

Проблема в параметре типа void*. Я не знаю, что эквивалентно С# для указателя на пустоту.

Я пробовал небезопасное выполнение с "void*", но, видимо, это не то же самое. Я также пробовал просто "void", но компилятор C# утверждает, что void нельзя использовать в качестве типа параметра.

Любые идеи?

Error CS0123: A method or delegate `MyProgram.MainWindow.alertDidEnd(MonoMac.AppKit.NSAlert, int, MonoMac.Foundation.NSObject)' parameters do not match delegate `MonoMac.Foundation.NSAction()' parameters (CS0123)

Обновление (после решения проблемы):

Это вызов и метод, который сделал эту работу:

alert.BeginSheet ((NSWindow)sender, this, new Selector ("alertDidEnd:returnCode:contextInfo:"), IntPtr.Zero);


[Export("alertDidEnd:returnCode:contextInfo:")]
public void alertDidEnd (NSAlert alert, int result, IntPtr ci)
{}

Первый отображает оповещение, прикрепленное к окну, второй — объявление метода функции, вызываемой при отклонении оповещения. Результат сохраняется в int result.


person Andrew J. Brehm    schedule 04.05.2012    source источник


Ответы (2)


void* сопоставляется с IntPtr в .net:

[Export("alertDidEnd:returnCode:contextInfo:")] 
public void alertDidEnd (NSAlert alert, int returnCode, IntPtr contextInfo) 
{ 
    Console.WriteLine (returnCode); 
}

Вы можете посмотреть здесь для рабочего примера:

https://github.com/picoe/Eto/blob/master/Source/Eto.Platform.Mac/Forms/MacModal.cs

Кроме того, из вашего сообщения об ошибке похоже, что вы должны просто использовать простой метод без параметров для всего, с чем вы его используете. NSAction — это делегат без параметров.

person Curtis    schedule 10.05.2012
comment
Та, я попробую. (Если бы я использовал метод без параметров, я бы не знал, какая кнопка была нажата в окне сообщения.) - person Andrew J. Brehm; 11.05.2012
comment
Это может помочь, если вы опубликуете то, что вы на самом деле пытаетесь сделать, поскольку кажется, что вы неправильно используете NSAlert. если вы проверите возвращаемое значение myAlert.RunModal(), это также даст вам код возврата. - person Curtis; 11.05.2012
comment
Я думал, что RunModal() является альтернативой beginSheetModalForWindow(). Я не думал, что должен звонить им обоим. - person Andrew J. Brehm; 11.05.2012
comment
Это так, хотя вы не упомянули, что используете BeginSheetModalForWindow(), или не предоставили какой-либо код того, как вы его вызываете, - это может помочь определить проблему. - person Curtis; 12.05.2012
comment
Во всех учебниках Cocoa я обнаружил, что метод Begin...() всегда использовался, когда также требовался метод AlertDidEnd(). Я думал, что они должны быть вместе. - person Andrew J. Brehm; 12.05.2012
comment
Я хочу сказать, что проблема может заключаться не в том, как вы реализуете AlertDidEnd, а в том, как вы вызываете методы Begin…(). - person Curtis; 12.05.2012
comment
Так вы говорите, что ваша проблема решена? Приведенный выше код не является причиной вашей ошибки компиляции. - person Curtis; 13.05.2012

Вы можете определить метод как:

[Export("alertDidEnd:returnCode:contextInfo:")] 
public void alertDidEnd (NSAlert alert, int returnCode, NSObject contextInfo) 
{ 
    Console.WriteLine (returnCode); 
}

Указатель void * будет заключен в NSObject.

person Laurent Etiemble    schedule 05.05.2012
comment
Это не сработало для меня. См. сообщение об ошибке, измененное на вопрос. - person Andrew J. Brehm; 05.05.2012