我正在尝试创建一个连接到打开的应用程序的多个实例(WRQ反射).使用以下方法连接到已打开的第一个实例:
Session appInstance = (Marshal.GetActiveObject("Reflection4.Session.8") as Session);
Run Code Online (Sandbox Code Playgroud)
但我希望能够连接到多个实例.我一直在做很多研究并发现了一些有用的链接,比如这个,但是这个解决方案在这种情况下不会起作用,因为所有打开的实例都有相同的progId.
我也尝试过查看窗口句柄,每个实例都明显不同.使用这个:
Process[] processes = Process.GetProcessesByName("r4win");
foreach (Process p in processes)
{
IntPtr windowHandle = p.MainWindowHandle;
string handle = windowHandle.ToString();
MessageBox.Show(handle);
}
Run Code Online (Sandbox Code Playgroud)
但是我无法弄清楚如何通过窗口句柄创建与窗口的连接.
任何帮助表示赞赏.
附加代码:
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");
}
}
Run Code Online (Sandbox Code Playgroud)
对于这种情况,我有2个目标应用程序实例正在运行.在上面的代码中,它将字符串12345发送到应用程序的同一个实例,两次.
我需要它将12345发送到第一个实例,然后12345发送到第二个实例.
您可以使用类NamedPipeClientStream
和NamedPipeServerStream
中System.IO.Pipes
-命名从应用程序到另一个发送数据.在您的第一个应用程序中实现NamedPipeServerStream
如下:
NamedPipeServerStream pipeServer = new NamedPipeServerStream("MyApp1");
pipeServer.WaitForConnection();//wait for connection of client
Run Code Online (Sandbox Code Playgroud)
NamedPipeClientStream
在第二个应用程序中放置一个实例:
NamedPipeClientStream clientStream = new NamedPipeClientStream("MyApp1");
clientStream.Connect();
Run Code Online (Sandbox Code Playgroud)
连接client
到之后,server
您可以使用方法发送数据Write
:
从服务器发送数据:
byte[] test = Encoding.UTF8.GetBytes("Hello World");
pipeServer.Write(test, 0, test.Length);
Run Code Online (Sandbox Code Playgroud)
从客户端发送数据:
byte[] test = Encoding.UTF8.GetBytes("Hello World");
clientStream.Write(test, 0, test.Length);
Run Code Online (Sandbox Code Playgroud)
您可以使用Read
获取接收的字节.此方法存在于两个类中.
您还可以同时使用多个服务器和一个客户端与更多应用程序进行通信.