Ryan
Ryan

Reputation: 257

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?

Upvotes: 20

Views: 850

Answers (2)

Elian Ebbing
Elian Ebbing

Reputation: 19037

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.

Upvotes: 9

Mark Alicz
Mark Alicz

Reputation: 387

Odd error/bug. Other than using a replace function or extension method to always return the correct format you could try using

System.Reflection.Assembly.GetExecutingAssembly().Location 

instead of ExecutablePath.

Upvotes: 1

Related Questions