19

我的 C# 应用程序将其用双引号括起来的完整路径写入文件,其中:

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

通常它可以工作,写入的文件包含

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

但是,如果我的应用程序的可执行路径包含#,就会发生一些奇怪的事情。输出变为:

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

# 之后的斜杠变为正斜杠。这会导致我正在开发的系统出现问题。

为什么会发生这种情况,有没有一种比字符串更优雅的方法来防止它。在写入之前替换路径?

4

2 回答 2

9

我只是查看了 的源代码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;

* ) 实现比这更复杂,因为它还处理有多个 appdomain 的情况和其他特殊情况。我简化了最常见情况的代码。

于 2012-10-18T01:51:03.847 回答
1

奇怪的错误/错误。除了使用替换函数或扩展方法来始终返回正确的格式之外,您可以尝试使用

System.Reflection.Assembly.GetExecutingAssembly().Location 

而不是 ExecutablePath。

于 2012-10-18T01:31:00.130 回答