默认情况下,引用服务可执行文件的本地文件

时间:2012-02-29 22:28:13

标签: c# windows service

我在c#.Net 4.0中创建了一个Windows服务。

在VS中它运行良好,我已经构建了项目并安装了exe作为运行的服务。

我发现当作为服务运行时,应用程序不会引用我放在与服务exe相同的目录中的应用程序配置文件。

如果我在代码中强烈输入完整的文件路径没有问题,但这不是一个理想的解决方案,因为用户可以随时随地安装。

如何让应用程序引用(查找)EXE本地文件,而不是假设.Net服务包装器所在的位置。

谷歌似乎没有任何帮助。

实施例

工作:

var config =
                    ClassLib.XmlInterface.DeserializeConfiguration(
                        "C:\\Users\\Damo\\Documents\\Visual Studio 2010\\Projects\\FileDownloadService\\FileDownloadService\\bin\\Debug\\config.xml");

不起作用:(争议是EXE的当地争议)

var config =
                    ClassLib.XmlInterface.DeserializeConfiguration(
                        "config.xml");

1 个答案:

答案 0 :(得分:0)

有几种方法可以解决这个问题。

您可以创建一个环境变量,并从中读取路径。如果您没有安装应用程序,这种情况很糟糕,如果用户使用他们的设置,它很容易破损。但如果你正确地做到了,它就会奏效。

如果您有一个安装应用程序,您还可以在注册表中存储可执行文件的路径,并在运行时读取它。

或者,您可以尝试使用以下内容检索程序集的路径:

    public static string GetCoreAssemblyPathRoot()
    {
        const string AssemblyName = "MyAssemblyName,";
        var loadedAssemblies = AppDomain.CurrentDomain.GetAssemblies();
        var path = (from assembly in loadedAssemblies
                    where assembly.FullName.StartsWith(AssemblyName)
                    select Path.GetDirectoryName(assembly.Location))
                   .FirstOrDefault();
        if (path == null)
        {
            return null;
        }
        //  The last part of the path is "\bin". Remove it, and return the remainder.
        var index = path.IndexOf("\\bin\\");
        return index == -1
                   ? path
                   : path.Substring(0, index);
    }