2つのコンソールアプリケーション(assusme A&B)とWCFサービスライブラリを含むプログラムを作成しました。AとBを接続して、メッセージをAからBまたはBからA(WCFデュプレックス)に転送できるようにしました。これを行うために、AプロジェクトとBプロジェクトの両方にWCFサービスライブラリの参照を追加しました。これらのコンソールアプリケーションをWinFormアプリケーションに変更したいのですが、コンソールアプリケーションにはWCFサービスライブラリで使用できるconsole.writeline()がありますが、WinFormではMessageBoxをWCFサービスで使用できないためです。
また、循環依存エラーが発生するため、AとBの参照をWcfサービスに追加できません
編集済み:
これはコンソールアプリケーションを使用したプロジェクトです:
プロジェクト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");
}
プロジェクト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();
}
}
IMYMessage.csファイル(WCFサービスライブラリ):
public interface IMyMessageCallback
{
[OperationContract(IsOneWay = true)]
void OnCallback(string message);
}
[ServiceContract(CallbackContract = typeof(IMyMessageCallback))]
public interface IMyMessage
{
[OperationContract]
void MessageToServer(string message);
}
MessageService.csファイル(WCFサービスライブラリ):
public class MessageService : IMyMessage
{
public void MessageToServer(string message)
{
Console.WriteLine("message from the client: {0}", message);
IMyMessageCallback callback =
OperationContext.Current.
GetCallbackChannel<IMyMessageCallback>();
callback.OnCallback("message from the server");
new Thread(ThreadCallback).Start(callback);
}
private void ThreadCallback(object callback)
{
IMyMessageCallback messageCallback = callback as IMyMessageCallback;
for (int i = 0; i < 10; i++)
{
messageCallback.OnCallback("message " + i.ToString());
Thread.Sleep(1000);
}
}
}