繁体   English   中英

获取引用项目的可执行文件名称

[英]Get the executable name of a referenced project

我有两个项目的解决方案,一个主项目和一个从项目。 这两个项目都是WinForms应用程序。 主节点始终有一个实例在运行,而从属实例则有多个实例。 从站由主站启动。 现在,我已经将奴隶的可执行名称硬编码到主人的代码中,可以正常工作。 但是,我希望能够在不对其进行硬编码的情况下获得从属的可执行文件名称,而是通过其引用获取它。 这可能吗,我应该怎么做呢?

这是我目前拥有的:

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

但是我想用动态的东西代替"Slave.exe" 我已经为从项目添加了程序集引用,并命名空间为Slave

感谢@Postlagerkarte的建议,我通过使用后期构建事件解决了我的问题。 我有4个不同的从属进程,我们将它们SlaveProcessASlaveProcessD 我要做的第一件事是创建一个可以保存可执行文件名称的类,并对其进行反序列化:

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。 现在,通过将以下内容放入SlaveProcessA的Post-build事件命令行中,可以使用ExeNameSaver程序将可执行文件的名称保存到XML文件中:

$(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,并从那里使用它们的名称。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM