c # - Referencefiler, der er lokale til tjenesten, der kan køres som standard

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har oprettet en windows service i c # .Net 4.0.


I VS fungerer det godt, jeg har bygget projektet og installeret exe som en service, der kører.


Jeg har fundet ud af, at applikationen, når den fungerer som en tjeneste, ikke refererer til applikationskonfigurationsfiler, jeg har placeret i samme mappe som service exe.


Hvis jeg skriver stærkt den fulde filsti i kode, er der ikke noget problem, men det er ikke en ideel løsning, da brugerne kunne installere ting, hvor de end måtte lide.


Hvordan kan jeg gøre ansøgningsreference (se efter) filer lokalt til EXE, og jeg antager ikke, hvor .Net-serviceindpakningen er placeret.


Intet synes at være nyttigt på google.


Eksempel


Fungerer:


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


Fungerer ikke: (Tvist blevet lokal til EXE)


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

Bedste reference


Der er et par måder at løse dette på.


Du kan oprette en miljøvariabel og læse stien fra den. Dette er lidt kludgy, hvis du ikke har et installationsprogram, og det er udsat for brud, hvis brugerne muckes med deres indstillinger. Men det vil fungere, hvis du gør det korrekt.


Hvis du har et opsætningsprogram, kan du også gemme stien til din eksekverbare i registreringsdatabasen og læse den på kørselstidspunktet.


Eller du kan prøve at hente vejen til din forsamling ved kørsel ved hjælp af noget som dette:


    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 "in". Remove it, and return the remainder.
        var index = path.IndexOf("\bin\");
        return index == -1
                   ? path
                   : path.Substring(0, index);
    }