Search code examples
c#cstringpathslash

Odd C# path issue


My C# application writes its full path surrounded by double quotes to a file, with:

streamWriter.WriteLine("\"" + Application.ExecutablePath + "\"");

Normally it works, the written file contains

"D:\Dev\Projects\MyApp\bin\Debug\MyApp.exe"

But, if the executable path of my application contains a #, something weird happens. The output becomes:

"D:\Dev\Projects#/MyApp/bin/Debug/MyApp.exe"

The slashes after the # become forward slashes. This causes issues with the system I am developing.

Why is this happening, and is there a way to prevent it that is more elegant than string.replacing the path before writing?


Solution

  • I just looked into the source code of Application.ExecutablePath, and the implementation is essentially this*:

    Assembly asm = Assembly.GetEntryAssembly();
    string cb = asm.CodeBase;
    var codeBase = new Uri(cb); 
    
    if (codeBase.IsFile) 
        return codeBase.LocalPath + Uri.UnescapeDataString(codeBase.Fragment);
    else
        return codeBase.ToString();
    

    The property Assembly.CodeBase will return the location as an URI. Something like:

    file:///C:/myfolder/myfile.exe

    The # is the fragment marker in a URI; it marks the beginning of the fragment. Apparently, the Uri class alters the given uri when it's parsed and converted back to a string again.

    Since Assembly.Location contains a 'normal' file path, I guess your best alternative is:

    string executablePath = Assembly().GetEntryAssembly().Location;
    

    *) The implementation is more complex than this, because it also deals with situations where there are multiple appdomains and other special situations. I simplified the code for the most common situation.