C# 在WCF服务中使用表单控件

C# 在WCF服务中使用表单控件,c#,winforms,wcf,controls,C#,Winforms,Wcf,Controls,我编写了一个有两个控制台应用程序(assusme a&B)和一个WCF服务库的程序。 我将A和B连接在一起,以便消息可以从A传输到B或B传输到A(WCF双工)。 为此,我在A&B项目中添加了WCF服务库的引用。 现在我想将这些控制台应用程序更改为WinForm应用程序,但我不能这样做 因为在控制台应用程序中,我们有console.writeline(),它可以在WCF服务库中使用,但在WinForm中,MessageBox不能在WCF服务中使用 此外,我无法将A&B的引用添加到Wcf服务,因为它

我编写了一个有两个控制台应用程序(assusme a&B)和一个WCF服务库的程序。 我将A和B连接在一起,以便消息可以从A传输到B或B传输到A(WCF双工)。 为此,我在A&B项目中添加了WCF服务库的引用。 现在我想将这些控制台应用程序更改为WinForm应用程序,但我不能这样做 因为在控制台应用程序中,我们有console.writeline(),它可以在WCF服务库中使用,但在WinForm中,MessageBox不能在WCF服务中使用

此外,我无法将A&B的引用添加到Wcf服务,因为它会产生循环依赖错误

编辑:

这是带有控制台应用程序的项目:

在Project A Program.cs文件中:

   internal static void StartService()
  {
     myServiceHost = new ServiceHost(typeof(WCF.MessageService));

     myServiceHost.Open();
  }

  internal static void StopService()
  {
     if (myServiceHost.State != CommunicationState.Closed)
        myServiceHost.Close();
  }

  static void Main()
  {
     StartService();
     Console.WriteLine("Service running; press return to exit");
     Console.ReadLine();
     StopService();
     Console.WriteLine("stopped");
  }
在Project B Program.cs文件中:

   class ClientCallback : IMyMessageCallback
{
  public void OnCallback(string message)
  {
     Console.WriteLine("message from the server: {0}", message);
  }
}

class Program
{
  static void Main()
  {
     Console.WriteLine("Client - wait for service");
     Console.ReadLine();

     WSDualHttpBinding binding = new WSDualHttpBinding();
     EndpointAddress address =
           newEndpointAddress("http://localhost:8731/Design_Time_Addresses/MessageService/Service1/");

     ClientCallback clientCallback = new ClientCallback();
      InstanceContext context = new InstanceContext(clientCallback);

     DuplexChannelFactory<IMyMessage> factory =
        new DuplexChannelFactory<IMyMessage>(context, binding, address);

     IMyMessage messageChannel = factory.CreateChannel();

     messageChannel.MessageToServer("From the client");

     Console.WriteLine("Client - press return to exit");
     Console.ReadLine();

  }
在MessageService.cs文件(WCF服务库)中:

公共类消息服务:IMyMessage
{
public void MessageToServer(字符串消息)
{
WriteLine(“来自客户端的消息:{0}”,message);
IMyMessageCallback=
OperationContext.Current。
GetCallbackChannel();
OnCallback(“来自服务器的消息”);
新线程(ThreadCallback).Start(callback);
}
私有void线程回调(对象回调)
{
IMyMessageCallback messageCallback=作为IMyMessageCallback进行回调;
对于(int i=0;i<10;i++)
{
messageCallback.OnCallback(“message”+i.ToString());
睡眠(1000);
}
}
}

我有点惊讶于您能够让它与控制台应用程序一起工作,我希望您也能得到一个循环依赖关系

我认为您应该重新构建您的解决方案,这样A&B就不会相互引用。您正在使用WCF进行通信,因此不需要以任何方式引用它们

此外,WCF库不应执行任何UI类型行为,如控制台写行或消息框内容,只需返回字符串或对象,并让您的UI应用程序(如控制台应用程序或表单应用程序)处理用户交互/显示

----------- ----------- | | | | | A | | B | |(Console)| | (FORMS) | | | | | ----------- DUPLEX ----------- | Comms |<==========>| Comms | | (WCF) | | (WCF) | ----------- ----------- ----------- ----------- | | | | |A | | B| |(控制台)| |(表格)| | | | | -----------双工----------- |通信| |通信| |(WCF)| |(WCF)| ----------- -----------
我有点惊讶你能让它和控制台应用程序一起工作,我希望你也能得到一个循环依赖

我认为您应该重新构建您的解决方案,这样A&B就不会相互引用。您正在使用WCF进行通信,因此不需要以任何方式引用它们

此外,WCF库不应执行任何UI类型行为,如控制台写行或消息框内容,只需返回字符串或对象,并让您的UI应用程序(如控制台应用程序或表单应用程序)处理用户交互/显示

----------- ----------- | | | | | A | | B | |(Console)| | (FORMS) | | | | | ----------- DUPLEX ----------- | Comms |<==========>| Comms | | (WCF) | | (WCF) | ----------- ----------- ----------- ----------- | | | | |A | | B| |(控制台)| |(表格)| | | | | -----------双工----------- |通信| |通信| |(WCF)| |(WCF)| ----------- -----------
请显示您当前使用的代码,以及您如何尝试在两个表单之间进行通信。。我们不是读心术的人。。。!请参阅我编辑的问题请显示您当前使用的代码以及您如何尝试在两个表单之间进行沟通。。我们不是读心术的人。。。!请看我编辑的问题谢谢你的回答,我编辑了我的问题并粘贴了我的代码,我是WCF的新手,我在Wrox书中看到了类似的例子,我就这样实现了!A&B不相互参照!我在A&B中添加了WCF服务的参考谢谢你的回答,我编辑了我的问题并粘贴了我的代码,我是WCF的新手,我在Wrox书中看到了类似的示例,我实现了这样的功能!A&B不相互参照!我在A&B中添加WCF服务的参考 ----------- ----------- | | | | | A | | B | |(Console)| | (FORMS) | | | | | ----------- DUPLEX ----------- | Comms |<==========>| Comms | | (WCF) | | (WCF) | ----------- -----------