alertDidEnd:什么是Mono相当于Objective-C的void *?

时间:2012-05-04 22:42:53

标签: c# monomac nsalert

我正在尝试实现一个基于Cocoa的方法

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

问题是void *类型的参数。我不知道指向void的C#等价物是什么。

我尝试使用“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结果中。

2 个答案:

答案 0 :(得分:1)

void *映射到.net中的IntPtr:

[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是一个没有参数的委托。

答案 1 :(得分:0)

您可以将方法定义为:

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

void *指针将被包装到NSObject中。