Подтвердить что ты не робот

Нечетная проблема с С#

Приложение My С# записывает полный путь, окруженный двойными кавычками, в файл:

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

Обычно это работает, записанный файл содержит

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

Но если исполняемый путь моего приложения содержит #, произойдет что-то странное. Выход будет:

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

Черты после # становятся косой чертой. Это вызывает проблемы с системой, которую я разрабатываю.

Почему это происходит, и есть ли способ предотвратить его, который является более элегантным, чем string.replacing путь до написания?

4b9b3361

Ответ 1

Я только посмотрел исходный код Application.ExecutablePath, и реализация по существу такова: *

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();

Свойство Assembly.CodeBase вернет местоположение как URI. Что-то вроде:

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

# - это маркер фрагмента в URI; он отмечает начало фрагмента. По-видимому, класс Uri изменяет данный uri, когда он анализируется и снова преобразуется обратно в строку.

Так как Assembly.Location содержит "нормальный" путь к файлу, я думаю, ваша лучшая альтернатива:

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

*) Реализация более сложная, чем эта, потому что она также касается ситуаций, когда есть несколько областей приложения и другие особые ситуации. Я упростил код для наиболее распространенной ситуации.

Ответ 2

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

System.Reflection.Assembly.GetExecutingAssembly().Location 

вместо ExecutablePath.