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;

* )複数のアプリドメインが存在する状況やその他の特別な状況も処理するため、実装はこれよりも複雑です。最も一般的な状況のためにコードを簡略化しました。

于 2012-10-18T01:51:03.847 に答える
1

奇妙なエラー/バグ。replace関数またはextensionメソッドを使用して、常に正しい形式を返す以外に、使用してみることができます

System.Reflection.Assembly.GetExecutingAssembly().Location 

ExecutablePathの代わりに。

于 2012-10-18T01:31:00.130 に答える