Получить имя исполняемого файла ссылочного проекта

1

У меня есть решение с двумя проектами, мастером и подчиненным. Оба этих проекта - это приложения WinForms. Там всегда один экземпляр мастера и несколько экземпляров ведомых. Ведущие запускаются ведомыми. Прямо сейчас у меня есть исполняемое имя ведомого, закодированного в мастер-код, который отлично работает. Тем не менее, я хочу иметь возможность получить исполняемое имя подчиненного устройства без его жесткого кодирования, но, получив его через ссылку. Возможно ли это, и как я должен это делать?

Это то, что я сейчас имею:

ProcessStartInfo startInfo = new ProcessStartInfo("Slave.exe") { Arguments = Args };
Process.Start(startInfo);

Но я хотел бы заменить "Slave.exe" чем-то динамичным. Я добавил ссылку на сборку для подчиненного проекта, имеющего пространство имен Slave.

  • 0
    На какую ссылку вы ссылаетесь? Имя - это тоже ссылка.
  • 1
    Я имею в виду ссылку на проект, как в проекте> ссылки> Добавить ссылку
Показать ещё 7 комментариев
Теги:

1 ответ

0
Лучший ответ

Благодаря предложению @Postlagerkarte, я решил свою проблему, используя события пост-сборки. У меня есть 4 разных подчиненных процесса, позвольте им вызвать SlaveProcessA на SlaveProcessD. Первое, что я сделал, это сделать класс, который может содержать исполняемые имена и (de) сериализовать их:

public class ExeNames {
    [XmlIgnore]
    public bool IsLoaded {get; private set;}
    [XmlIgnore]
    const string Filename = "exenames.xml";
    public string SlaveAExe {get; set;}
    public string SlaveBExe {get; set;}
    public string SlaveDExe {get; set;}
    public string SlaveCExe {get; set;}

    public void Load() {
      var serializer = new XmlSerializer(typeof(ExeNames));
      using (StreamReader reader = new StreamReader(Filename)) {
        ExeNames End = serializer.Deserialize(reader) as ExeNames;
        if (End == null) return;
        SlaveAExe = End.SlaveAExe;
        SlaveBExe = End.SlaveBExe;
        SlaveDExe = End.SlaveDExe;
        SlaveCExe = End.SlaveCExe;
        IsLoaded = true;
      }
    }

    public void Save() {
      var serializer = new XmlSerializer(typeof(ExeNames));
      using (StreamWriter writer = new StreamWriter(Filename)) {
        serializer.Serialize(writer, this);
      }
    }
  }

После этого я создал новый проект под названием ExeNameSaver. Эта программа принимает 2 параметра: код процесса и имя исполняемого файла:

namespace ExeNameSaver {
  class Program {
    static void Main(string[] args) {
      if (args.Length < 2) throw new ArgumentException("2 Parameters are required");
      var Code = args[0];
      var Exe = args[1];
      ExeNames.ExeNames Exn = new ExeNames.ExeNames();
      try {
        Exn.Load();
      }
      catch {
        Console.WriteLine("Starting new file...");
      }
      switch (Code) {
        case "SlaveA":
          Exn.SlaveAExe = Exe;
          break;
        case "SlaveB":
          Exn.SlaveBExe = Exe;
          break;
        case "SlaveC":
          Exn.SlaveCExe = Exe;
          break;
        case "SlaveD":
          Exn.SlaveDExe = Exe;
          break;
        default:
          Console.WriteLine("Invalid process code: " + Code);
          break;
      }
      Exn.Save();
    }
  }
}

Затем я убеждаюсь, что ExeNameSaver сначала создается, изменяя зависимости. Теперь я могу использовать программу ExeNameSaver для сохранения моих исполняемых имен в XML файле, поставив в командной строке Post-build событие SlaveProcessA следующее:

$(OutDir)ExeNameSaver.exe SlaveA $(TargetFileName)

И аналогично для остальных 3 рабов.

$(OutDir)ExeNameSaver.exe SlaveB $(TargetFileName)

...

$(OutDir)ExeNameSaver.exe SlaveC $(TargetFileName)

...

$(OutDir)ExeNameSaver.exe SlaveD $(TargetFileName)

Теперь после каждой сборки файл exenames.xml будет содержать исполняемые имена моих 4 процессов. Затем я могу загрузить этот XML, используя тот же класс ExeNames в моей основной программе, и использую их имена оттуда.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню