我正在尝试为现有的iOS SDK创建Xamarin.iOS绑定。我使用ObjectiveC-Sharpie创建ApiDefinition.cs并在Xamarin绑定项目中使用它来创建dll文件。该库按预期工作,我能够使用示例应用程序测试该DLL。
下一步,我试图将Objective-C代表更改为C#事件。我遵循了Xamarin文档和其他类似性质的项目。但是,生成的事件始终缺少原始方法的第一个参数。
最初的Objective-C协议方法是:
- (void)foundDevice:(Device*)device amongstAvailableDevices:(NSDictionary*)dictionary;
这是我做的:
这就是ApiDefinition.cs的样子:
[BaseType (typeof (NSObject), Name="MyClass", Delegates=new string [] {"Delegate"}, Events = new Type [] { typeof (MyClassDelegate) })]
interface MyClass
{
[Export ("delegate", ArgumentSemantic.Weak)]
[NullAllowed]
NSObject WeakDelegate { get; set; }
[Wrap ("WeakDelegate")]
MyClassDelegate Delegate { get; set; }
[Static, Export ("sharedInstance")]
MyClass SharedInstance();
}
[Protocol,Model]
[BaseType (typeof (NSObject))]
interface MyClassDelegate
{
...
[Export ("foundDevice:amongstAvailableDevices:"), EventArgs("MyClassFoundDevice")]
void FoundDevice(Device device, NSDictionary deviceDictionary);
...
}
项目已完成,我在Sample项目中导入了dll文件。上述代表的事件正在生成:
MyClass finder = new MyClass();
finder.FoundDevice += (object sender, MyClassFoundDeviceEventArgs e) => {
Console.WriteLine ("Found device " + e.DeviceDictionary.ToString());
};
但是,我无法访问委托方法的第一个参数(在本例中为设备设备)。就像在,如果我尝试访问e.device,它会给出编译错误 - 甚至没有出现在自动完成建议中。这种情况发生在所有委托方法中:第一个参数无法从eventArgs访问。 MyClassFoundDeviceEventArgs类看起来像:
public class MyClassFoundDeviceEventArgs : EventArgs
{
//
// Properties
//
public NSDictionary DeviceDictionary {
[CompilerGenerated]
get;
[CompilerGenerated]
set;
}
//
// Constructors
//
public MyClassFoundDeviceEventArgs (NSDictionary deviceDictionary);
}
我尝试在ApiDefinition中为托管方法声明添加一个虚拟的第一个参数:
void FoundDevice(MyClass this, Device device, NSDictionary deviceDictionary);
我能够访问"设备设备"从eventargs但项目编译失败,给出错误:
错误MT4117:注册商在方法中发现签名不匹配 - 选择器foundDevice:amongAvailableDevices:表示方法有2个参数,而托管方法FoundDevice有3个参数。 (MT4117)。