Ссылочные файлы, локальные для исполняемого файла службы по умолчанию - PullRequest
0 голосов
/ 01 марта 2012

Я создал службу Windows в c # .Net 4.0.

В VS это прекрасно работает, я собрал проект и установил exe как сервис, который работает.

Я обнаружил, что при работе в качестве службы приложение не ссылается на файлы конфигурации приложения, которые я поместил в тот же каталог, что и exe службы.

Если я строго ввожу полный путь к файлу в коде, проблем не возникает, однако это не идеальное решение, так как пользователи могут устанавливать вещи где угодно.

Как сделать, чтобы приложение обращалось (искало) к файлам локально по отношению к EXE-файлу, а я не предполагаю, где находится служебная оболочка .Net.

Кажется, в Google ничего не помогает.

Пример

Работает:

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 голосов
/ 01 марта 2012

Есть несколько способов решить эту проблему.

Вы можете создать переменную среды и прочитать из нее путь.Это немного глупо, если у вас нет приложения Setup, и оно может сломаться, если пользователи испортят свои настройки.Но это будет работать, если вы сделаете это правильно.

Если у вас есть приложение установки, вы также можете сохранить путь к исполняемому файлу в реестре и прочитать его во время выполнения.

Или,вы можете попытаться получить путь к вашей сборке во время выполнения, используя что-то вроде этого:

    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);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...