C# 获取应用程序路径-WPF与Windows服务

C# 获取应用程序路径-WPF与Windows服务,c#,wpf,windows-services,C#,Wpf,Windows Services,我需要知道一种可靠的方法来确定启动windows服务的文件夹。确定这一点的方法似乎与在WPF应用程序中确定它的方法不同 更多详细信息,请阅读: 我有一个嵌入式sql数据库,WPF应用程序和windows服务都使用它 在开发过程中,这两个项目的数据库相对路径不同,因为它们在访问同一个嵌入式数据库时从自己的调试目录运行 现在,我正在尝试创建一个安装程序。我已将windows服务可执行文件和wpf应用程序可执行文件移到同一根目录 在wpf应用程序中,我正在成功创建指向嵌入式数据库的数据库连接字符串,但

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

更多详细信息,请阅读:

我有一个嵌入式sql数据库,WPF应用程序和windows服务都使用它

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

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


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

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


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

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


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

我认为您从错误的方向攻击了问题。我将在WPF应用程序和Windows服务的配置文件中配置数据库的路径。然后,您的代码只需使用配置文件中的路径构建连接字符串


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

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


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

要获取安装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;
    }

要获取安装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;
    }

@LonnieBest:您真的应该提供更多关于如何在每个环境中获取路径的信息,以便我们可以指出您可能遇到的任何错误。您希望在服务流程内部还是外部使用代码获取路径?我有两个应用程序都使用的代码库。所以我想写一些代码来找到数据库的正确路径,无论wpf应用程序或windows服务正在使用代码库的是哪个应用程序。@LonnieBest:您确实应该提供更多信息,说明如何在每个环境中获取路径,以便我们指出您可能遇到的任何错误。是否要使用服务中的代码获取路径进程还是外部?我有两个应用程序都使用的代码库。因此,无论wpf应用程序或windows服务使用的是哪个应用程序,我都希望编写能够获得正确的数据库路径的代码。因为应用程序可以安装在任何机器上。如您所述,如果我在配置文件中设置了一个路径,我如何确保这些应用程序安装的每个位置的路径都是正确的,没有为每次安装手动配置它们?这将是一个自定义安装行为的好地方,允许强制用户选择数据库的位置。我认为用户不必知道数据库在哪里。因为它是一个嵌入式数据库,我的两个应用程序都使用它,所以我应该找到一种通过编程确定连接字符串的方法。数据库将位于安装应用程序的正确位置,然后由两个应用程序使用。如果你在我的系统上的%Program Files%下粘贴数据库,我会生气的。您应该从用户的角度考虑这一点。99%的人可能不在乎,但我们这些有真正灾难恢复计划的人会希望将重要数据放在一个我们知道会得到适当备份的位置。Payton,该数据库用于两个应用程序共享某些数据。所有数据都不值得备份;它被用作两个应用程序的协作存储空间,以便在会话之间以一定程度的持久性进行通信。它放在哪里非常好。首要任务是使其易于使用。因此,我希望用户不必做任何我可以自动化的事情。我的应用程序应该知道他们的数据库在哪里;这不是推给用户的负担
必须以编程方式确定。因为应用程序可以安装在任何机器上。如您所述,如果我在配置文件中设置了一个路径,我如何确保这些应用程序安装的每个位置的路径都是正确的,没有为每次安装手动配置它们?这将是一个自定义安装行为的好地方,允许强制用户选择数据库的位置。我认为用户不必知道数据库在哪里。因为它是一个嵌入式数据库,我的两个应用程序都使用它,所以我应该找到一种通过编程确定连接字符串的方法。数据库将位于安装应用程序的正确位置,然后由两个应用程序使用。如果你在我的系统上的%Program Files%下粘贴数据库,我会生气的。您应该从用户的角度考虑这一点。99%的人可能不在乎,但我们这些有真正灾难恢复计划的人会希望将重要数据放在一个我们知道会得到适当备份的位置。Payton,该数据库用于两个应用程序共享某些数据。所有数据都不值得备份;它被用作两个应用程序的协作存储空间,以便在会话之间以一定程度的持久性进行通信。它放在哪里非常好。首要任务是使其易于使用。因此,我希望用户不必做任何我可以自动化的事情。我的应用程序应该知道他们的数据库在哪里;这对用户来说不是一个负担。我找不到您提到的确切方法/属性GetEntryAssembly。也许这是因为我试图从代码库而不是服务本身访问它。GetEntryAssembly是一种静态的组装方法。您需要添加“using System.Reflection”以让IntelliSense显示它。我找不到您提到的确切方法/属性GetEntryAssembly。也许这是因为我试图从代码库而不是服务本身访问它。GetEntryAssembly是一种静态的组装方法。您需要添加一个“using System.Reflection”来让IntelliSense显示它。