如何从另一个应用程序读取 .NET Core 控制台应用程序的内部结构?
How to read internals of .NET Core console app from another app?
我有一个 .NET Core 控制台应用程序,它用一些 public 属性实例化了一些 public classes。它 运行 是一个在某些条件下修改这些 public 属性的循环。这些属性在应用程序的生命周期内每秒更新几次。
现在我想要另一个带有用户界面的应用程序来显示来自控制台应用程序的数据。我如何从一个应用程序获取另一个应用程序的 public 属性中的数据?
不需要
- 我只对 public class 中的 public 属性感兴趣。我对私有属性或字段或内部 classes.
不感兴趣
- 属性更新非常频繁,所以我不想写入文件。我也不想登录到某些云服务,例如 Azure Application Insights。
- 我宁愿不对控制台应用程序进行广泛或侵入性的修改(例如写入命名管道或网络套接字)只是为了其他应用程序能够读取数据。
想法
- 是否有任何属性可以用来注释 classes 或其属性?
- 我是否必须将控制台应用程序重构为控制台应用程序和 UI 应用程序都引用的 class 库?这会将所有代码移出到 class 库中,并使控制台应用程序只剩下一个静态 main 方法,该方法调用 运行 class 库中的代码。
- 我的 UI 应用程序可以附加到控制台应用程序的进程吗?
要在进程之间进行通信,您只能使用几个实用选项(none 您似乎想要这样做):
- 命名管道
- 某种基于套接字的通信(在这种情况下不是 WCF,因为您使用的是 .NET Core)
- 这可能是您的应用程序之间的自定义协议。
- 可以使用外部消息代理(例如 RabbitMQ)。
- 可以从控制台应用程序发送 UDP 消息。
- 基于文件的通信(考虑到界面的繁琐程度,这似乎不适合您的场景)。
我使用 System.Runtime.Loader.AssemblyLoadContext
.
解决了这个问题
我在运行时将程序集加载到我的应用程序中,然后实例化它的 类 并从我的实例中读取 public 属性。
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);
}
}
解决此问题的另一种方法是将项目导入为项目引用。这样我就受益于强类型。
我有一个 .NET Core 控制台应用程序,它用一些 public 属性实例化了一些 public classes。它 运行 是一个在某些条件下修改这些 public 属性的循环。这些属性在应用程序的生命周期内每秒更新几次。
现在我想要另一个带有用户界面的应用程序来显示来自控制台应用程序的数据。我如何从一个应用程序获取另一个应用程序的 public 属性中的数据?
不需要
- 我只对 public class 中的 public 属性感兴趣。我对私有属性或字段或内部 classes. 不感兴趣
- 属性更新非常频繁,所以我不想写入文件。我也不想登录到某些云服务,例如 Azure Application Insights。
- 我宁愿不对控制台应用程序进行广泛或侵入性的修改(例如写入命名管道或网络套接字)只是为了其他应用程序能够读取数据。
想法
- 是否有任何属性可以用来注释 classes 或其属性?
- 我是否必须将控制台应用程序重构为控制台应用程序和 UI 应用程序都引用的 class 库?这会将所有代码移出到 class 库中,并使控制台应用程序只剩下一个静态 main 方法,该方法调用 运行 class 库中的代码。
- 我的 UI 应用程序可以附加到控制台应用程序的进程吗?
要在进程之间进行通信,您只能使用几个实用选项(none 您似乎想要这样做):
- 命名管道
- 某种基于套接字的通信(在这种情况下不是 WCF,因为您使用的是 .NET Core)
- 这可能是您的应用程序之间的自定义协议。
- 可以使用外部消息代理(例如 RabbitMQ)。
- 可以从控制台应用程序发送 UDP 消息。
- 基于文件的通信(考虑到界面的繁琐程度,这似乎不适合您的场景)。
我使用 System.Runtime.Loader.AssemblyLoadContext
.
我在运行时将程序集加载到我的应用程序中,然后实例化它的 类 并从我的实例中读取 public 属性。
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);
}
}
解决此问题的另一种方法是将项目导入为项目引用。这样我就受益于强类型。