Как прочитать внутреннюю часть консольного приложения .NET Core из другого приложения? - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть консольное приложение .NET Core , которое создает некоторые открытые классы с некоторыми общими свойствами.Он запускает цикл, который при определенных условиях изменяет эти общедоступные свойства.Эти свойства обновляются несколько раз в секунду в течение всего срока службы приложения.

Теперь я хочу, чтобы другое приложение с пользовательским интерфейсом представляло данные из консольного приложения.Как бы мне из одного приложения получить данные, присутствующие в открытых свойствах другого приложения?

Не нужно

  • Меня интересуют только открытые свойства в открытых классах.Меня не интересуют частные свойства или поля или внутренние классы.
  • Свойства очень часто обновляются, поэтому я не хочу записывать в файл.Также я не хочу регистрироваться в какой-либо облачной службе, такой как Azure Application Insights.
  • Я бы не стал вносить обширные или навязчивые изменения в консольное приложение (например, запись в именованный канал или сетевой сокет) только длядругое приложение для чтения данных.

Мысли

  • Имеется ли какой-либо атрибут, которым я могу аннотировать классы или их свойства?
  • Нужно ли реорганизовывать консольное приложение в библиотеку классов, на которую ссылаются как консольное приложение, так и приложение пользовательского интерфейса?Это позволило бы переместить весь код в библиотеку классов и оставить консольное приложение с помощью только статического основного метода, который выполняет один вызов метода для запуска кода в библиотеке классов.
  • Может ли мое приложение пользовательского интерфейса присоединиться к процессуконсольного приложения?

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

Я решил это, используя 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);
    }
}

Еще один способ решить эту проблему - импортировать проект в качестве ссылки на проект.Таким образом, я получаю выгоду от строгой типизации.

0 голосов
/ 05 декабря 2018

Для обмена данными между процессами вы ограничены несколькими практическими вариантами (ни один из которых вам, похоже, не нужен):

  • Именованные каналы
  • Какой-то сокетоснованная на коммуникации (в данном случае не WCF, потому что вы используете .NET Core)
    • Это может быть пользовательский протокол между вашими приложениями.
    • Может использоваться внешний брокер сообщений (например, RabbitMQ).
    • Может отправлять UDP-сообщения из консольного приложения.
  • Файловое взаимодействие (не кажется идеальным для вашего сценария, учитывая, насколько болтливым является интерфейс).
...