【问题标题】:Getting Application Path - WPF versus Windows Service获取应用程序路径 - WPF 与 Windows 服务
【发布时间】:2010-02-25 21:08:43
【问题描述】:

我需要知道一种可靠的方法来确定启动 Windows 服务的文件夹。确定它的方式似乎与您在 WPF 应用程序中确定它的方式不同。

更多详情(可选阅读):

我有一个被 WPF 应用程序和 Windows 服务使用的嵌入式 sql 数据库。

在开发过程中,两个项目的数据库相对路径不同,因为它们在访问同一个嵌入式数据库时一直从自己的调试目录运行。

现在,我正在尝试创建一个安装程序。我已将 Windows 服务可执行文件和 wpf 应用程序可执行文件移至同一根目录。

在 wpf 应用程序中,我成功创建了一个指向嵌入式数据库的数据库连接字符串,但在 windows 服务中,我没有成功创建此连接字符串。

【问题讨论】:

  • @LonnieBest:您确实应该提供更多关于如何在每个环境中获取路径的信息,以便我们可以指出您可能遇到的任何错误。
  • 你想在服务进程内部还是外部使用代码获取路径?
  • 我有两个应用程序都使用的代码库。因此,无论哪个应用程序(wpf 应用程序或 windows 服务)正在使用代码库,我都想编写代码来获取数据库的正确路径。

标签: c# wpf windows-services


【解决方案1】:

要获取安装windows服务的目录,可以使用:

        private string GetExeDir()
    {
        System.Reflection.Assembly ass = System.Reflection.Assembly.GetExecutingAssembly();
        string codeBase = System.IO.Path.GetDirectoryName(ass.CodeBase);
        System.Uri uri = new Uri(codeBase);
        return uri.LocalPath;
    }

【讨论】:

    【解决方案2】:

    使用 Assembly.GetEntryAssembly 获取您的主程序集。在那里,您将拥有 Location 属性,告诉您代码的安装位置。

    请注意,服务的当前目录是 c:\windows\system32(假设默认安装目录)。

    【讨论】:

    • 我找不到您提到的确切方法/属性 (GetEntryAssembly)。也许这是因为我试图从代码库而不是服务本身访问它。
    • GetEntryAssembly 是 Assembly 的静态方法。您需要添加一个“使用 System.Reflection”才能让 IntelliSense 显示它。
    【解决方案3】:

    我认为您从错误的方向解决问题。我会在 WPF 应用程序和 Windows 服务的配置文件中配置数据库的路径。然后您的代码将简单地使用配置文件中的路径构建连接字符串。

    或者,您可以考虑使用环境变量并在安装程序中设置该环境变量。

    【讨论】:

    • 路径必须以编程方式确定。因为该应用程序可以安装在任何机器上。如果我在配置文件中设置路径,如您所述,我如何确保安装这些应用程序的每个位置的路径都是正确的,而无需为每次安装手动配置它们?
    • 这将是自定义安装行为允许强制用户选择数据库位置的好地方。
    • 我认为用户不必知道数据库在哪里。因为它是一个嵌入式数据库,我的两个应用程序都使用它,所以我应该想办法以编程方式确定连接字符串。数据库将位于安装应用程序的正确位置,然后由两个应用程序使用。
    • 如果您在我的系统上的 %Program Files% 下粘贴数据库,我会很生气。您应该从用户的角度考虑这一点。 99% 的人可能不在乎,但我们这些拥有真正灾难恢复计划的人会希望将重要数据放在我们知道会得到适当备份的位置。
    • Payton,数据库用于两个应用程序共享某些数据。没有任何数据值得备份;它被用作两个应用程序的协作内存空间,以便在会话之间以一定程度的持久性进行通信。它的放置位置非常好。首要任务是使其易于使用。因此,我想消除用户必须做任何我可以自动化的事情。我的应用程序应该知道他们的数据库在哪里;推给用户不是负担。
    猜你喜欢
    • 2016-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-07
    相关资源
    最近更新 更多