代码之家  ›  专栏  ›  技术社区  ›  Fred

如何从另一个应用程序读取.NET核心控制台应用程序的内部内容?

  •  -2
  • Fred  · 技术社区  · 7 年前

    我有一个

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

    不需要

    • 我只对公共课程中的公共属性感兴趣。我对私有属性、字段或内部类不感兴趣。
    • 属性经常更新,所以我不想写入文件。我也不想登录到某些云服务,如Azure Application Insights。
    • 我不希望为了让另一个应用程序能够读取数据而对控制台应用程序进行广泛或侵入性的修改(例如写入命名管道或网络套接字)。

    思想

    • 是否有任何属性可以用来注释类或它们的属性?
    • 我是否必须将控制台应用程序重构为控制台应用程序和UI应用程序都引用的类库?这会将所有代码移出到类库中,并使控制台应用程序只剩下一个静态main方法,该方法只调用一个方法来运行类库中的代码。
    2 回复  |  直到 7 年前
        1
  •  0
  •   RQDQ    7 年前

    • 某种基于套接字的通信(在本例中不是WCF,因为您使用的是.NETCore)
      • 这可能是应用程序之间的自定义协议。
      • 可以使用外部消息代理(例如RabbitMQ)。
      • 无法从控制台应用程序发送UDP消息。
    • 基于文件的通信(考虑到界面的健谈性,似乎不适合您的场景)。
        2
  •  -1
  •   Fred    7 年前

    我用计算机解决了这个问题 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);
        }
    }
    

    解决此问题的另一种方法是将项目作为项目引用导入。这样我就得益于强大的打字能力。