Доступ к объектам из консольного приложения c # извне

#c# #output #console-application

#c# #вывод #консольное приложение

Вопрос:

Я новый младший разработчик и работаю над своим первым сольным проектом. Для этого я создаю консольное приложение c # для автоматического создания документов Word. Планируется интегрировать приложение в разные проекты и разные среды, поэтому оно должно быть автономным решением. Но для того, чтобы придать ему немного больше удобства и универсальности, я хочу, чтобы приложение выдавало некоторый вывод.

Из-за различных условий приложение также должно использоваться, например, со скриптом Python. Что было бы наилучшей практикой для этого??? особенно, если вы хотите предоставлять разные выходные данные в зависимости от варианта использования???

Небольшой пример: я получаю объект json со всей информацией для создания документа Word. В автономном решении мне не нужен вывод (он создает только документ word и pfd). Но если я хочу использовать приложение в проекте пользовательского интерфейса wpf, если мне нужны функции предварительного просмотра и оперативного обновления, было бы неплохо иметь доступ к созданным объектам. Для достижения этой цели я бы работал с возвращаемым значением (код выхода) и (в зависимости от кода) снова создавал нужные объекты, или я бы вставил его как библиотеку и просто вызвал все обычные функциональные возможности, или я мог бы даже сделать что-то вроде выходного значения или сложного возвращаемого значения (например, string[]), чтобы вернуть сериализованный объект?

a.)

 static int Main(string[] args)
{
   //do something
   return *code for decision making*
}
  

б.) создать библиотеку

c.)

 static void Main(string[] args, out string[] output)
{
   //do something
   output = *serialized object(s)*
}
  

или

 static string[] Main(string[] args)
{
   //do something
   return *serialized object(s)*
}
  

Комментарии:

1. Это немного неясно, что вы на самом деле хотите сделать?

2. доступ к объекту, который был создан в консольном приложении, из другого приложения.

3. Доступ к нему из 2 разных процессов? или совместное использование библиотеки между 2 приложениями во время разработки?

4. В идеале у меня был бы доступ к объекту в 2 разных процессах во время выполнения. но я думаю, что также было бы неплохо отправлять их между 2 процессами, когда это необходимо. как я уже сказал, я новичок и не уверен на 100%, что было бы наилучшей практикой, поэтому, возможно, есть даже решение 3, которого я не вижу

5. Обычно в наши дни (в .net) вы просто сериализуете объект и используете какой-то IPC. Теоретически вы могли бы совместно использовать память, используя что-то вроде файла с отображением памяти . Хотя для большинства приложений первое было бы более распространенным, если бы у вас не было конкретного варианта использования

Ответ №1:

Согласно этой статье MSDN, Main() метод в C # может иметь только эти подписи:

 public static void Main();
public static int Main();
public static void Main(string[] args);
public static int Main(string[] args);
public static async Task Main();
public static async Task<int> Main();
public static async Task Main(string[] args);
public static async Task<int> Main(string[] args);
  

Это показывает, что невозможно вернуть данные об объекте из Main() метода в C #.

Однако вы можете вернуть данные об объекте для обработки другой средой / программой, распечатав данные об этом объекте в поток вывода консоли в формате, подобном JSON. Из вашей другой среды (например, Python) вы можете прочитать поток вывода консоли вашей программы C # в виде строки, а затем проанализировать его.

Комментарии:

1. спасибо за информацию. это означает, что решение c.) невозможно. потому что его запись не дает мне никаких ошибок. но, полагаю, я не могу правильно получить доступ к возвращаемому / выходному значению?

2. На самом деле вы должны получить сообщение об ошибке. Причина, по которой вы не получаете ошибку, заключается в том, что вы, вероятно, уже определили действительную Main() подпись точки входа в свой исходный код. Поскольку это определено, ваша другая перегрузка Main() метода (пример C) никогда не будет запущена. Технически говоря, вы действительно можете получить доступ к возвращаемому значению вашего перегруженного метода, однако вы не можете вернуть его в своем действительном Main() методе.