【问题标题】:C# Windows Service - Start .exe from App.configC# Windows 服务 - 从 App.config 启动 .exe
【发布时间】:2018-01-01 22:55:36
【问题描述】:

我使用下面的代码从 Windows 服务执行一个 .exe 文件。

System.Diagnostics.Process.Start(path);

现在,我将路径硬编码为 @'C:\Program Files\Server\Test.exe' 它工作正常。

现在,我想避免硬编码。当我只使用 Test.exe 时,它​​会转到 C:\Windows\System32。

如何从windows服务动态获取安装路径?或者如何从 App.config 文件中读取路径?

【问题讨论】:

  • 确保您可以从服务 App.config 文件中读取包含路径的配置值。
  • 如果其他 exe 部署在与您的服务相同的文件夹中,我建议避免将此类信息放在配置文件中。当根据 tinudu 的(例如)下面的答案在运行时自动显示信息时,后者只会导致额外的维护
  • @MickyD 对于路径,我使用了 tinud 的 cdeo。我也有 Thread.Sleep(minutes),作为轮询间隔。如何从 App.config 中读取“分钟”。

标签: c# windows-services windows-installer


【解决方案1】:

如果您一直使用 .net(即您的 Windows 服务是一个 .net 应用程序),那么您可以使用 Assembly.GetEntryAssembly(来自 System.Reflection 命名空间):

var entryAssembly = Assembly.GetEntryAssembly();
var launchLocation = entryAssembly.Location;

或者,您可以检查您正在执行的AppDomain(假设您对其中的多个没有做任何聪明的事情!)

var appDomain = AppDomain.CurrentDomain;
var launchLocation = appDomain.BaseDirectory;

一个简单的控制台应用程序:

static void Main(string[] args)
{
    var entryAssembly = Assembly.GetEntryAssembly();
    var launchLocationFromAssembly = entryAssembly.Location;


    var appDomain = AppDomain.CurrentDomain;
    var launchLocationFromAppDomain = appDomain.BaseDirectory;

    Console.WriteLine(launchLocationFromAssembly);
    Console.WriteLine(launchLocationFromAppDomain);
}

给出以下输出:

c:\users\robertwray\documents\visual studio 2015\Projects\ConsoleApplication4\ConsoleApplication4\bin\Debug\ConsoleApplication4.exe

c:\users\robertwray\documents\visual studio 2015\Projects\ConsoleApplication4\ConsoleApplication4\bin\Debug\

这意味着,如果您确实使用 Assembly 来检索路径,则需要使用以下内容去除可执行文件的名称:

var launchPathFromAssembly = Path.GetDirectoryName(launchLocationFromAssembly);

【讨论】:

    【解决方案2】:

    你可以使用

    AppDomain.CurrentDomain.BaseDirectory
    

    【讨论】:

      【解决方案3】:

      Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)

      【讨论】:

      • 单行代码完美运行。关于从 Windows 服务读取 App.config 文件没有错误的任何想法。
      • 在 App.config 中:<configuration><appSettings><add key="bla" value="quack"/></...,在 C# 中:var bla = (string)new AppSettingsReader().GetValue("bla", typeof(string)); // quack
      • 我收到Configuration system failed to initialize 错误。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-20
      • 2015-11-28
      • 2022-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多