3
我正在开发一个使用Bonjour算法在网络中查找服务的程序。我下载了Bonjour SDK for Windows。 .Net上有两个示例应用程序。两者都是Windows Forms项目。示例工作正常,但是当我试图实现示例控制台应用程序时,我收到AccessViolationException。 这里是我的代码:适用于Windows的Bonjour sdk仅在UI线程中运行
class Program
{
static void Main(string[] args)
{
DNSSDService service = new DNSSDService();
DNSSDEventManager eventManager = new DNSSDEventManager();
eventManager.ServiceFound += new _IDNSSDEvents_ServiceFoundEventHandler(eventManager_ServiceFound);
//next line raises AccessViolationException
DNSSDService browse = service.Browse(0, 0, "_psia._tcp", null, eventManager);
Console.ReadKey();
}
static void eventManager_ServiceFound(DNSSDService browser, DNSSDFlags flags, uint ifIndex, string serviceName, string regtype, string domain)
{
//TODO: some logic
}
}
我找到了解决方案 - 从卓悦库中的所有方法应该从STA线程调用。所以我给Main方法添加了[STAThread]属性。代码现在看起来像这样:
class Program
{
[STAThread]
static void Main(string[] args)
{
DNSSDService service = new DNSSDService();
DNSSDEventManager eventManager = new DNSSDEventManager();
eventManager.ServiceFound += new _IDNSSDEvents_ServiceFoundEventHandler(eventManager_ServiceFound);
DNSSDService browse = service.Browse(0, 0, "_psia._tcp", null, eventManager);
Console.ReadKey();
}
static void eventManager_ServiceFound(DNSSDService browser, DNSSDFlags flags, uint ifIndex, string serviceName, string regtype, string domain)
{
//TODO: some logic
}
}
我解决了AccessViolationException但收到一个新的问题。 在我调用方法Browse之后,应该为网络中定义的每个服务调用'ServiceFound'事件。但事实并非如此。经过一段时间的调查后,我发现我需要运行消息泵来接收所有这些事件。所以最终的代码如下所示:
class Program
{
[STAThread]
static void Main(string[] args)
{
DNSSDService service = new DNSSDService();
DNSSDEventManager eventManager = new DNSSDEventManager();
eventManager.ServiceFound += new _IDNSSDEvents_ServiceFoundEventHandler(eventManager_ServiceFound);
DNSSDService browse = service.Browse(0, 0, "_psia._tcp", null, eventManager);
Application.Run();
}
static void eventManager_ServiceFound(DNSSDService browser, DNSSDFlags flags, uint ifIndex, string serviceName, string regtype, string domain)
{
//TODO: some logic
}
}
要停止消息循环调用Application.Exit()。
你帮了我很多!!!!你知道如何获得:'eventManager_ServiceFound'中的IP地址和端口吗? – Yoda