Thanks to @Postlagerkarte's suggestion, I solved my problem by using post build events. I have 4 different slave processes, let's call them SlaveProcessA
to SlaveProcessD
. First thing I did was make a class which can hold the executable names, and (de)serialize them:
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);
}
}
}
After that, I created a new project called ExeNameSaver
. This program takes 2 parameters: the code of the process, and the executable name:
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();
}
}
}
Then, I make sure that the ExeNameSaver is built first by altering the dependencies. Now I can use the ExeNameSaver program to save my executable names to an XML-file, by putting the following in the Post-build event command line of SlaveProcessA:
$(OutDir)ExeNameSaver.exe SlaveA $(TargetFileName)
And similarly for the other 3 slaves.
$(OutDir)ExeNameSaver.exe SlaveB $(TargetFileName)
...
$(OutDir)ExeNameSaver.exe SlaveC $(TargetFileName)
...
$(OutDir)ExeNameSaver.exe SlaveD $(TargetFileName)
Now after each build, the exenames.xml
file will contain the executable names of my 4 processes. I can then load this XML using the same ExeNames class in my master program and use their names from there.