2017-03-27 80 views
0

不知道要设置哪个标题,因为我不完全知道问题所在。 我有一个工作c#代码,我把它包装到dll来分隔客户端与其他功能,但现在它不像预期的那样工作。它是通过udp的客户端服务器。这里是我的代码:c# - DLL无法正常工作

HandlerFactory factory = new HandlerFactory(); 
     factory.RegisterHandler(RequestType.Options,() => new OptionsHandler()); 
     factory.RegisterHandler(RequestType.Unauthorized,() => new UnauthorizedHandler()); 
     factory.RegisterHandler(RequestType.Ok,() => new OkHandler()); 
     factory.RegisterHandler(RequestType.Invite,() => new InviteHandler()); 
     factory.RegisterHandler(RequestType.Bye,() => new ByeHandler()); 
     factory.RegisterHandler(RequestType.Error,() => new ErrorHandler()); 

     Application.SetCompatibleTextRenderingDefault(false); 


     Client client = new Client(factory); 
     client.Start(); 
     client.Register(); 

而在客户端:

private void Listen() 
    { 
     while (!_stopping) 
     { 
      try 
      { 
       var asyncResult = MyUdpClient.BeginReceive(HandleIncomingUdpRequest, null); 
       WaitHandle.WaitAny(new[] { _stopHandle, asyncResult.AsyncWaitHandle }); 
      } 
      catch (Exception ex) 
      { 
       using (var sw = new StreamWriter("log.txt")) 
       { 
        sw.WriteLine("Date:" + DateTime.Now + "\r\nError:" + ex.Message + "\r\n"); 
       } 
      } 
     } 
     MyUdpClient.Close(); 
    } 

private void HandleIncomingUdpRequest(IAsyncResult ar) 
     { 
      var received = MyUdpClient.EndReceive(ar, ref _serverAddress); 
      var requestString = Encoding.ASCII.GetString(received); 
      var type = Helper.GetRequestType(requestString); 
      if (type != RequestType.Trying && type != RequestType.Unknown) 
      { 
       ProcessRequest(type, requestString); 
      } 
     } 

所以,我把它包成DLL,现在这样使用它:

 var factory = new Factory.HandlerFactory(); 
     factory.RegisterHandler(RequestType.Options,()=> new OptionsHandler()); 
     factory.RegisterHandler(RequestType.Unauthorized,() => new UnauthorizedHandler()); 
     factory.RegisterHandler(RequestType.Ok,() => new OkHandler()); 
     factory.RegisterHandler(RequestType.Invite,() => new InviteHandler()); 
     factory.RegisterHandler(RequestType.Bye,() => new ByeHandler()); 
     factory.RegisterHandler(RequestType.Error,() => new ErrorHandler()); 
     Client cl = new Client(factory); 
     cl.Start(); 
     cl.Register(); 
     cl.Call("2"); 

的问题是,在cl.Call("2")我得到“在System.dll中发生类型'System.ObjectDisposedException'的未处理异常”

   var received = MyUdpClient.EndReceive(ar, ref _serverAddress); 

而在Register()中,客户端应该发送注册请求,得到他不是Unauthorized的响应并调用UnauthorizedHandler,但是这没有发生。

+3

您需要检查异常中的调用堆栈以确定*哪个*类型已被处理 - 这可能使您能够找出发生了什么。 –

+0

我调试了DLL,发现问题是什么,谢谢! – Jamil

回答

0

的问题是 - 我不知道怎么回事 - 在此代码:

private void Listen() 
    { 
     while (!_stopping) 
     { 
      try 
      { 
       var asyncResult = MyUdpClient.BeginReceive(HandleIncomingUdpRequest, null); 
       WaitHandle.WaitAny(new[] { _stopHandle, asyncResult.AsyncWaitHandle }); 
      } 
      catch (Exception ex) 
      { 
       using (var sw = new StreamWriter("log.txt")) 
       { 
        sw.WriteLine("Date:" + DateTime.Now + "\r\nError:" + ex.Message + "\r\n"); 
       } 
      } 
      MyUdpClient.Close(); 
     } 
    } 

MyUdpClient.Close()被称为内循环。我必须改变try-catch块,并不小心把它放在循环中,当我问这个问题时,我从不同的来源拷贝了它。

1

只是从指定的行和你的描述,我会检查是否ref _serverAddress已正确初始化,因为它似乎是最有可能在您的主应用程序中插入的全局变量,但您已将该用法移出到dll。

+0

为了改善您的答案中的代码,请调用MyUdpClient.Close();在终于阻止尝试赶上。 – Bobo