如何从另一个应用程序读取.NET Core控制台应用程序的内部信息?

时间:2018-12-05 00:24:19

标签: .net-core ipc

我有一个 .NET Core 控制台应用程序,该应用程序实例化了具有某些公共属性的一些公共类。它运行一个循环,在某些条件下会修改这些公共属性。在应用程序的整个生命周期中,这些属性每秒都会更新几次。

现在,我希望具有用户界面的另一个应用程序可以显示来自控制台应用程序的数据。我如何从一个应用程序中获取数据存在于另一个应用程序的公共属性中?

不需要

  • 我只对公共课中的公共财产感兴趣。我对私有属性或字段或内部类不感兴趣。
  • 属性非常频繁地更新,因此我不想写入文件。我也不想登录到某些云服务,例如Azure Application Insights。
  • 我不想对控制台应用程序进行大范围或侵入式的修改(例如,写入命名管道或网络套接字),只是为了让其他应用程序能够读取数据。

想法

  • 我可以使用任何属性来注释类或它们的属性吗?
  • 是否必须将控制台应用程序重构为控制台应用程序和UI应用程序都引用的类库?这样会将所有代码移到类库中,并只向控制台应用程序提供一个静态main方法,该方法执行一个方法调用以在类库中运行代码。
  • 我的UI应用程序可以附加到控制台应用程序的进程吗?

2 个答案:

答案 0 :(得分:0)

要在各个流程之间进行交流,您只能使用一些实用的选项(您似乎不想做的事情):

  • 命名管道
  • 某种基于套接字的通信(在这种情况下不是WCF,因为您使用的是.NET Core)
    • 这可能是您的应用程序之间的自定义协议。
    • 可以使用外部消息代理(例如RabbitMQ)。
    • 可以从控制台应用程序发送UDP消息。
  • 基于文件的通信(鉴于界面的健谈性,这对于您的情况似乎并不理想。

答案 1 :(得分:-1)

我用System.Runtime.Loader.AssemblyLoadContext解决了这个问题。

我在运行时将程序集加载到应用程序中,然后实例化其类并从实例中读取公共属性。

class Program
{
    static void Main(string[] args)
    {
        var fileName = @"C:\temp\foo.dll";
        var assembly = AssemblyLoadContext.Default.LoadFromAssemblyPath(fileName);
        var type = assembly.GetType("MyApplication.Car");
        dynamic carInstance = Activator.CreateInstance(type);
        Console.WriteLine(carInstance.Color);
    }
}

解决此问题的另一种方法是通过导入项目作为项目参考。这样,我就可以从强大的输入中受益。