gpt4 book ai didi

c# - 向其他进程发送消息

转载 作者:行者123 更新时间:2023-12-02 21:56:43 26 4
gpt4 key购买 nike

我希望能够在服务器应用程序和客户端应用程序之间进行通信。这两个应用程序都是用 C#/WPF 编写的。接口(interface)位于单独的 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。

现在我希望能够从服务器向正在运行的客户端发送消息。我使用方法 void ReceiveMessage(string message);

在 Interface-DLL 中引入了 IClient-Interface

MainWindow.xaml.cs 正在实现 IClient 接口(interface)。

我现在的问题是,当我只有进程对象时,如何在服务器中获取 IClient 对象。我考虑过 Activator.CreateInstance,但我不知道如何做到这一点。我很确定我可以通过进程句柄获取 IClient,但我不知道如何获取。

有什么想法吗?

最佳答案

正如其他帖子提到的一种常见方法是创建服务,太简单了,我会考虑看看 ServiceStack 。 AFAIK ServiceStack 用于 stackoverflow

pluralsight 上也有关于它的类(class)。

ServiceStack 确实很容易托管在任何 .net dll 中(无需 iis 等),并且没有 WCF 的配置复杂性。

端点也可以作为 SOAP 和 REST 使用,无需配置任何内容

例如,这定义了一个 hello world 服务

public class HelloService : IService<Hello>
{
public object Execute(Hello request)
{
return new HelloResponse { Result = "Hello, " + request.Name };
}
}

这里是客户端代码的示例:

var response = client.Send<HelloResponse>(new Hello { Name = "World!" });
Console.WriteLine(response.Result); // => Hello, World

您可以找到更多复杂的示例和演练位于:ServiceStack.Hello

关于c# - 向其他进程发送消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17647562/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com