我有两个项目的解决方案,主人和奴隶。这两个项目都是WinForms Applications。 总是有一个主运行实例和多个从属实例。奴隶由主人启动。 现在我将奴隶的可执行文件名称硬编码到主代码中,工作正常。 但是,我希望能够在不对其进行硬编码的情况下获取从属设备的可执行文件名称,而是通过其引用获取它。 这是可能的,我该怎么做呢?
这就是我目前所拥有的:
ProcessStartInfo startInfo = new ProcessStartInfo("Slave.exe") { Arguments = Args };
Process.Start(startInfo);
但我想用动态的东西取代"Slave.exe"
。我已经为slave项目添加了一个程序集引用,其名称空间为Slave
。
答案 0 :(得分:0)
感谢@ Postlagerkarte的建议,我通过使用post build事件解决了我的问题。我有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
的新项目。该程序有两个参数:进程代码和可执行文件名:
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文件,方法是将以下内容放在SlaveProcessA的Post-build事件命令行中:
$(OutDir)ExeNameSaver.exe SlaveA $(TargetFileName)
对于其他3个奴隶也是如此。
$(OutDir)ExeNameSaver.exe SlaveB $(TargetFileName)
...
$(OutDir)ExeNameSaver.exe SlaveC $(TargetFileName)
...
$(OutDir)ExeNameSaver.exe SlaveD $(TargetFileName)
现在每次构建后,exenames.xml
文件将包含我的4个进程的可执行文件名。然后,我可以在我的主程序中使用相同的ExeNames类加载此XML,并从那里使用它们的名称。