如何从正在运行的进程实例化类

问题描述 投票:0回答:1

场景:我们写了一个小程序,我们称之为MyLittleProggy.exe,可以启动它,它会继续运行,基本上只是闲置。

MyLittleProggy.exe 包含一个公共类 Class1

现在我们运行 AnotherProggy.exe

这就是我们正在努力做的:

  1. 检查 MyLittleProggy.exe 当前是否正在运行,我假设使用 System.Diagnostics.Process.GetProcessesByName - 无需解释这一点,但我们只是说我找到了进程,所以我知道 MyLittleProggy 正在运行。
  2. 在此运行过程中创建Class1的新实例

这两个应用程序都将针对 .NET Framework 4.8 编写

这可能吗?如果可以,我该怎么做?我是否可以使用它的模块从找到的 Process 对象开始工作?或者我需要使用 System.Reflection 吗?请注意,我并不是在寻找一个完整的例子,只是在正确的方向上提供一些指示,因为我目前有点迷失在杂草中,因此我也不确定如何提出正确的问题,所以请善良......我很高兴使用 C# 或 VB 编写的简短代码片段

谢谢你

c# vb.net .net-4.8 system.reflection system.diagnostics
1个回答
0
投票

我将为您提供两种选择,一种是每次

MyLittleProggy
启动时仅通知
AnotherProggy
,第二种是将数据从
AnotherProggy
发送到
MyLittleProggy

对于“仅通知”版本,我们将使用命名事件。这是

MyLittleProggy

Sub Main(args As String())
    Console.WriteLine("I just started up")

    Dim namedEvent As New EventWaitHandle(False, EventResetMode.AutoReset, "MyExampleEvent")
    Console.WriteLine("I just finished one-time initialization")

    For i = 1 To 5
        Console.WriteLine("Waiting to be notified that other app started")
        namedEvent.WaitOne()
        Console.WriteLine("I just got notified that the other app started")
    Next

    namedEvent.Dispose()
    Console.WriteLine("I just quit")
End Sub

这是

AnotherProggy

Sub Main(args As String())
    Console.WriteLine("AnotherProggy just started")

    Dim namedEvent As New EventWaitHandle(False, EventResetMode.AutoReset, "MyExampleEvent")
    Console.WriteLine("Initialization done")

    namedEvent.Set()
    Console.WriteLine("Just triggered event")

    namedEvent.Dispose()
    Console.WriteLine("I quit")
End Sub

此方法使用任何程序都可以通过名称引用的事件。 “重”

MyLittleProggy
执行一次重初始化,然后等待,直到其他事件触发该事件。 “轻”应用程序只是触发事件。

让我们继续讨论传递数据的版本。它使用命名管道。这是

MyLittleProggy

Sub Main(args As String())
    Console.WriteLine("I just started up")

    Dim namedPipe As New Pipes.NamedPipeServerStream("MyExamplePipe")
    Dim pipeReader As New StreamReader(namedPipe)
    Console.WriteLine("I just finished one-time initialization")

    For i = 1 To 5
        Console.WriteLine("Waiting for other app to send data")
        namedPipe.WaitForConnection()
        Console.WriteLine("Reading data from other app")
        Dim pipeData = pipeReader.ReadToEnd()
        Console.WriteLine($"Data from other app: {pipeData}")
        namedPipe.Disconnect()
    Next

    pipeReader.Dispose()
    namedPipe.Dispose()
    Console.WriteLine("I just quit")
End Sub

这是

AnotherProggy

Sub Main(args As String())
    Console.WriteLine("I just started")

    Dim namedPipe As New Pipes.NamedPipeClientStream("MyExamplePipe")
    Dim writer As New StreamWriter(namedPipe)
    Console.WriteLine("Initialization done")

    namedPipe.Connect()
    writer.Write("Hello")
    writer.Flush()
    Console.WriteLine("Just sent data")

    Console.WriteLine("Cleaning up")
    writer.Dispose()
    namedPipe.Dispose()
    Console.WriteLine("Quit")
End Sub

从概念上讲,这与第一个示例非常相似 - 您等待一个对象告诉您轻量级应用程序何时启动。这里的区别在于,您正在等待管道连接而不是命名事件,然后从管道中读取。

希望这足以让您开始。

© www.soinside.com 2019 - 2024. All rights reserved.