NSArray
Objective-C コードが を使用しない限り、を使用することはできませんNSArray
。つまり、ジェネレーターにより、一部の ObjC 構造を .NET 型 (たとえば ) にマップNSString
できstring
ますが、ObjC 型を再定義することはできません。
-(BOOL)playSound:(int)volume beepData:(int *)data length:(int)length error:(NSError **)error;
次のようにする必要があります。
[Export ("playSound:beepData:length:error:")]
bool PlaySound (int volume, IntPtr data, int length, out NSError error);
data
にマーシャリングする必要がありますIntPtr
。
IntPtr data = Marshal.AllocHGlobal (length);
Marshal.WriteInt32 (data1, 0);
後で解放します。
Marshal.FreeHGlobal (data);
これは、内部バインディングを呼び出すパブリック ヘルパー メソッドを使用して行うのが最適です。メソッドの定義に属性を追加することでPlaySound
メソッドを作成できます。したがって、次のようになります。internal
[Internal]
[Export ("playSound:beepData:length:error:")][Internal]
bool PlaySound (int volume, IntPtr data, int length, out NSError error);
そして、バインディングに次のコードを含めます (例: API.cs):
bool PlaySound (int volume, int[] data)
{
// I assume length is byte-based (check the docs)
int length = data.Length * 4;
IntPtr p = Marshal.AllocHGlobal (length);
int j = 0;
for (int i=0; i < length; i+=4)
Marshal.WriteInt32 (p [j++], i);
NSError error;
bool result = PlaySound (volume, p, length, out error);
// free memory before throwing the exception (if any)
Marshal.FreeHGlobal (data);
if (error != null)
throw new Exception (error.LocalizedDescription);
return result;
}
注: まったく試していません :-) ハードウェア、SDK、またはドキュメントを持っていません。YMMVですが、それは近いはずです。