Reputation: 257
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
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
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