我正在尝试创建一个绑定到Linea Pro(这是他们在Apple Stores,Lowes中使用的条形码扫描器)SDK。我使用David Sandor's绑定作为参考,但自2011年1月以来SDK已更新几次。
除了 playSound 调用之外,我已经完成了大部分工作,用于在Linea Pro设备上播放声音。
SDK中的.h文件的调用如下:
-(BOOL)playSound:(int)volume beepData:(int *)data length:(int)length error:(NSError **)error;
我尝试将int [],NSArray和IntPtr用于int [],但似乎没有任何效果。
我绑定的最后一次失败迭代看起来像:
[Export ("playSound:beepData:length:")]
void PlaySound (int volume, NSArray data, int length);
现在,这根本不起作用。另请注意,我不知道如何处理错误:(NSError **)错误部分。
我对C很缺乏认识,所以任何帮助都会非常感激。
答案 0 :(得分:1)
除非Objective-C代码使用NSArray
,否则您不能使用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,但应该接近。
答案 1 :(得分:1)
我遇到了同样的麻烦。然而,上面的poupou所提供的帮助足以让我走上正轨。我的linea pro设备现在在我要求的时候发出双响声,所以我想我应该使用经过测试的代码进行跟进。原谅任何风格的混乱,这是我的第一篇文章到stackoverflow ......
这是我使用的导出定义。它与上面提到的相同,只是想验证它是否有效。
[Export ("playSound:beepData:length:error:")]
bool PlaySound (int volume, IntPtr data, int length, out NSError error);
从那里开始,我只需要学习足够的c#以使编组工作顺利进行。 (我也是c#的新手)正如你所看到的,它只是从上面发布的内容中得到补丁。非常感谢你指出我正确的方向!
public void Beep()
{
int[] sound = {2730, 150, 0, 30, 2730, 150};
PlaySound(100, sound);
}
public bool PlaySound(int volume, int[] data)
{
// length is byte-based
int length = data.Length*4;
IntPtr p = Marshal.AllocHGlobal(length);
for (int i = 0; i < data.Length; i ++)
{
Marshal.WriteInt32(p, i*4, data[i]);
}
NSError error;
bool result = dtDevice.PlaySound(volume, p, length, out error);
// free memory before throwing the exception (if any)
Marshal.FreeHGlobal(p);
if (error != null)
throw new Exception(error.LocalizedDescription);
return result;
}