У меня есть решение с двумя проектами, мастером и подчиненным. Оба этих проекта - это приложения WinForms. Там всегда один экземпляр мастера и несколько экземпляров ведомых. Ведущие запускаются ведомыми. Прямо сейчас у меня есть исполняемое имя ведомого, закодированного в мастер-код, который отлично работает. Тем не менее, я хочу иметь возможность получить исполняемое имя подчиненного устройства без его жесткого кодирования, но, получив его через ссылку. Возможно ли это, и как я должен это делать?
Это то, что я сейчас имею:
ProcessStartInfo startInfo = new ProcessStartInfo("Slave.exe") { Arguments = Args };
Process.Start(startInfo);
Но я хотел бы заменить "Slave.exe"
чем-то динамичным. Я добавил ссылку на сборку для подчиненного проекта, имеющего пространство имен Slave
.
Благодаря предложению @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 в моей основной программе, и использую их имена оттуда.