2009-05-14 13 views
42

現在のアセンブリのパスを取得するにはどうすればよいですか?私は現在のアセンブリ(.dll)の場所に関連して、いくつかのパスからデータを取得する必要があります。現在のアセンブリのパスを取得する

誰かがリフレクション空間を使用するように言ったが、そこに何も見つかりませんでした。

を使用でき
+1

Assembly.GetExecutingAssembly()。場所 – RichieHindle

答えて

72

string path = (new System.Uri(Assembly.GetExecutingAssembly().CodeBase)).AbsolutePath; 

コメントのいくつかの提案が任意のパーセントエンコーディングが処理されることを保証するために、そしてTrueWillからPath.GetFullpathを(使用する(vvnurmiから)System.Uri.UnescapeDataStringを通じてそれを渡すためにあります)は、パスが標準のWindows形式であることを保証します(バックスラッシュの代わりにスラッシュを使用するのではなく)。ここでは、各段階で何を得るの例です:私たちはC:\Temp\Temp App\bin\Debug\TempApp.EXEを実行している

string s = Assembly.GetExecutingAssembly().CodeBase; 
Console.WriteLine("CodeBase: [" + s + "]"); 
s = (new Uri(s)).AbsolutePath; 
Console.WriteLine("AbsolutePath: [" + s + "]"); 
s = Uri.UnescapeDataString(s); 
Console.WriteLine("Unescaped: [" + s + "]"); 
s = Path.GetFullPath(s); 
Console.WriteLine("FullPath: [" + s + "]"); 

出力場合:

 
CodeBase: [file:///C:/Temp/Temp App/bin/Debug/TempApp.EXE] 
AbsolutePath: [C:/Temp/Temp%20App/bin/Debug/TempApp.EXE] 
Unescaped: [C:/Temp/Temp App/bin/Debug/TempApp.EXE] 
FullPath: [C:\Temp\Temp App\bin\Debug\TempApp.EXE] 
+7

Path.GetFullPathを呼び出して、スラッシュをバックスラッシュにすることをおすすめします。スラッシュを使用すると、Assembly.LoadFile(似ていないタイプなど)から奇妙な動作が発生する可能性があります。 – TrueWill

+3

'.Location'の代わりにこれを使う利点/目的は何ですか? –

+4

@pst:シャドウコピーは実行前にアセンブリを "移動"することができるので、環境によっては場所が間違っている可能性があります。 –

44

System.Reflection.AssemblyGetExecutingAssembly()。ちょうどそれを明確にするLocation

+13

+1のドキュメントリンクです。8-) – RichieHindle

+0

これは、MSTest単体テストから呼び出されたときに、アセンブリではなくmscorlibの場所を指定します。 –

6

Assembly.GetExecutingAssembly().Location 
+0

+1:ダウトは悪いです。 – RichieHindle

2

私は

new System.Uri(Assembly.GetExecutingAssembly().EscapedCodeBase).LocalPath; 

EscapedCodeBaseは、あなたのローカルパスがそれで、無効なURIの文字を持っているかもしれないシナリオをカバーしてい好む(https://stackoverflow.com/a/21056435/852208を参照)

LocalPathには、ローカルパスとuncパスの両方のフルパスが含まれます。ここで、AbsolutePathは "\\ server"を切り捨てます

関連する問題