我希望能够在服务器应用程序和客户端应用程序之间进行通信。这两个应用程序都是用 C#/WPF 编写的。接口位于一个单独的 DLL 中,两个应用程序都引用它。
在 interface-dll 中是 IDataInfo-Interface,它看起来像:
public interface IDataInfo
{
byte[] Header { get; }
byte[] Data { get; }
}
服务器应用程序通过以下代码调用客户端:
Serializer<IDataInfo> serializer = new Serializer<IDataInfo>();
IDataInfo dataInfo = new DataInfo(HEADERBYTES, CONTENTBYTES);
Process clientProcess = Process.Start("Client.exe", serializer.Serialize(dataInfo));
客户端应用程序通过以下方式从服务器获取消息:
Serializer<IDataInfo> serializer = new Serializer<IDataInfo>();
IDataInfo dataInfo = serializer.Deserialize(string.Join(" ", App.Args));
Serializer-Class 只是一个通用类,它使用 Soap-Formatter 来序列化/反序列化。代码如下所示:
public class Serializer<T>
{
private static readonly Encoding encoding = Encoding.Unicode;
public string Serialize(T value)
{
string result;
using (MemoryStream memoryStream = new MemoryStream())
{
SoapFormatter soapFormatter = new SoapFormatter();
soapFormatter.Serialize(memoryStream, value);
result = encoding.GetString(memoryStream.ToArray());
memoryStream.Flush();
}
return result;
}
public T Deserialize(string soap)
{
T result;
using (MemoryStream memoryStream = new MemoryStream(encoding.GetBytes(soap)))
{
SoapFormatter soapFormatter = new SoapFormatter();
result = (T)soapFormatter.Deserialize(memoryStream);
}
return result;
}
}
直到这里一切正常。服务器创建客户端,客户端可以将它的参数反序列化到IDataInfo
-Object。
现在我希望能够从服务器向正在运行的客户端发送消息。我用方法在Interface-DLL中引入了IClient-Interfacevoid ReceiveMessage(string message);
MainWindow.xaml.cs 正在实现 IClient 接口。
我现在的问题是,当我只有 Process-Object 时,如何在我的服务器中获取 IClient-Object。我想过Activator.CreateInstance
,但我不知道如何做到这一点。我很确定我可以通过进程的句柄获得 IClient,但我不知道如何。
任何想法?