我正在尝试创建与打开的应用程序的多个实例的连接(WRQ 反射)。使用此连接到打开的第一个实例很好:
Session appInstance = (Marshal.GetActiveObject("Reflection4.Session.8") as Session);
但我希望能够连接到多个实例。我一直在做大量研究并找到了一些有用的链接,例如 this ,但该解决方案在这种情况下不起作用,因为所有打开的实例都具有相同的 progId。
我还尝试查看窗口句柄,每个实例的句柄明显不同。使用这个:
Process[] processes = Process.GetProcessesByName("r4win");
foreach (Process p in processes)
{
IntPtr windowHandle = p.MainWindowHandle;
string handle = windowHandle.ToString();
MessageBox.Show(handle);
}
但我一直无法弄清楚如何通过窗口句柄创建到窗口的连接。
感谢任何帮助。
附加代码:
void TestROT()
{
// Look for open instances
string[] progIds = {"Reflection4.Session.8"};
List<object> instances = GetRunningInstances(progIds);
foreach (object refleObjs in instances)
{
Session session = refleObjs as Session;
session.Transmit("12345");
}
}
对于这种情况,我有 2 个目标应用程序实例在运行。在上面的代码中,它将字符串 12345 发送到应用程序的同一个实例,两次。
我需要它将 12345 发送到第一个实例,然后将 12345 发送到第二个实例。
最佳答案
您可以使用类 NamedPipeClientStream
和 NamedPipeServerStream
在System.IO.Pipes
-namespace 将数据从您的应用程序发送到另一个应用程序。
在您的第一个应用程序中实现一个 NamedPipeServerStream
,如下所示:
NamedPipeServerStream pipeServer = new NamedPipeServerStream("MyApp1");
pipeServer.WaitForConnection();//wait for connection of client
在您的第二个应用程序中放置一个 NamedPipeClientStream
的实例:
NamedPipeClientStream clientStream = new NamedPipeClientStream("MyApp1");
clientStream.Connect();
将客户端
连接到服务器
后,您可以使用方法Write
发送数据:
从您的服务器发送数据:
byte[] test = Encoding.UTF8.GetBytes("Hello World");
pipeServer.Write(test, 0, test.Length);
从客户端发送数据:
byte[] test = Encoding.UTF8.GetBytes("Hello World");
clientStream.Write(test, 0, test.Length);
您可以使用Read
来获取接收到的字节。这个方法在两个类中都存在。
您还可以同时使用多个服务器和一个客户端来与更多应用程序进行通信。
关于c# - 连接到应用程序的多个运行实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33563035/