我想向 MonoTouch 中的项目添加对DNSSDObjects的引用 ,特别是 DNSServiceResolve 对象。
我想在 MonoTouch 项目中访问 DNSServiceResolve,但在任何地方都找不到该类。
那怎么办?
我想向 MonoTouch 中的项目添加对DNSSDObjects的引用 ,特别是 DNSServiceResolve 对象。
我想在 MonoTouch 项目中访问 DNSServiceResolve,但在任何地方都找不到该类。
那怎么办?
我从 dns_sd.h 获得了使用 P/Invokes 的函数。大多数定义已经在项目 zeroconfignetservices [1] 中完成,特别是在文件 mDNSImports.cs 中。它不是引用dnssd.dll
,而是/usr/lib/system/libsystem_dnssd.dylib
在 iOS 上。
例如,DNSServiceQueryRecord 的定义是:
[DllImport("/usr/lib/system/libsystem_dnssd.dylib")]
public static extern DNSServiceErrorType DNSServiceQueryRecord(out IntPtr sdRef,
DNSServiceFlags flags,
UInt32 interfaceIndex,
[MarshalAs(
UnmanagedType.CustomMarshaler,
MarshalTypeRef = typeof(Utf8Marshaler))] String fullname,
DNSServiceType rrType,
DNSServiceClass rrClass,
DNSServiceQueryReply callBack,
IntPtr context);
对 SRV 记录的查询如下:
public void DoDnsLookup()
{
IntPtr sdRef;
var result = DNSServiceQueryRecord(
out sdRef,
DNSServiceFlags.LongLivedQuery,
0,
"_xmpp-client._tcp.gmail.com",
DNSServiceType.SRV,
DNSServiceClass.IN,
DnsServiceQueryReply,
IntPtr.Zero
);
if (result == DNSServiceErrorType.NoError)
{
DNSServiceProcessResult(sdRef);
DNSServiceRefDeallocate(sdRef);
}
}
//see [2] why this method is static and the attribute
[MonoPInvokeCallback(typeof(DNSServiceQueryReply))]
public static void DnsServiceQueryReply(
IntPtr sdRef,
DNSServiceFlags flags,
UInt32 interfaceIndex,
DNSServiceErrorType errorCode,
[MarshalAs(
UnmanagedType.CustomMarshaler,
MarshalTypeRef = typeof(Utf8Marshaler))] String fullname,
DNSServiceType rrType,
DNSServiceClass rrClass,
UInt16 rdLength,
[MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 7)]byte[] rData,
UInt32 ttl,
IntPtr context)
{
if (result == DNSServiceErrorType.NoError)
{
// process returned DNS data in rData
// a useful library for this could be Bdev.Net.Dns [3]
}
}
此处未定义的所有类、枚举等均来自 [1]。
参考: