2011-01-31 20 views
6

リフレクションを使用してプロジェクト名を取得しようとしていますが、部分文字列メソッドで「インデックス外のエラー」が発生します。リフレクションを使用して実行アセンブリ名を取得する

string s = System.Reflection.Assembly.GetExecutingAssembly().Location;   
int idx = s.LastIndexOf(@"\"); 
s = s.Substring(idx, s.Length); 

なぜ3行目でエラーが出るのかわかりません。

Plzヘルプ。

+0

:これを試してみてください。コードにはプロジェクト名が含まれていません。 – leppie

+5

彼らはブレークポイントを発明しました... –

+1

あなたのパスの長さは15文字で、s.Lengthは15であるとします。2つのパラメータを持つ部分文字列は、開始インデックスと長さを受け取ります。したがって、あなたの例では、開始インデックスから15文字を取得しようとしているため、インデックスが範囲外になります。サブストリングの使用を主張する場合は、2番目のパラメータをs.Length-idxに変更する必要があります。そうでない場合は、下記のようにSystem.IO.Path.GetFileNameを使用します。あなたの方法は、あなたも本当にidx + 1、s.Length - idx - 1を望むので、あなたの方法も\を返すでしょう –

答えて

14

試してみてください。

System.IO.Path.GetFileName(System.Reflection.Assembly.GetExecutingAssembly().Location) 
+0

はい、それは..働く..正確です。 – Karan

+5

プロジェクト名は必ずしもアセンブリ名と同じではありません。 –

1

あなたは、コードをデバッグしていますか? 2行目が-1以外の値を返すことは確かですか? 文字列にバックスラッシュが見つからない場合、LastIndexOfは-1を返します。これはSubstringで使用できる有効なインデックスではないため、「インデックスが範囲外です」というエラーがスローされます。

より安全な方法は、Pathクラスで定義されているメソッドを使用してファイル名を抽出することです。 しかし、 'プロジェクト名'は必ずしもアセンブリ名と同じではありません。

1

ホイールを再作成して部分文字列のインデックスを手動で計算する代わりに、Pathクラスを使用してください。

1

サブストリングの呼び出しから2番目のパラメータを削除するだけです。私はあなたのAssemblyInfoファイルにAssemblyTitle属性にアクセスしようとするだろう

// Exceptions: 
// System.ArgumentOutOfRangeException: 
//  startIndex plus length indicates a position not within this instance. -or- 
//  startIndex or length is less than zero. 
+0

これはまた動作します:-) – Karan

0

:ドキュメントから 。アセンブリの場所は、プロジェクト名と同じではない場合があります。プロジェクト名を明確に

Assembly a = Assembly.GetEntryAssembly(); 
AssemblyTitleAttribute titleAttr = (AssemblyTitleAttribute) a.GetCustomAttributes(typeof(AssemblyTitlenAttribute), false)[0]; 
Console.WriteLine("Title: " + titleAttr.Title); 

HTH

関連する問題