2011-01-31 32 views
6

Yansımayı kullanarak proje adını çekmeye çalışıyorum, ancak altdizeleme yöntemi sırasında bana "bağlı hatadan çıkma dizinini" ver.Yansımayı kullanarak derleme adı derleme alın

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

Neden üçüncü satırda hata veriyor anlamıyorum.

Plz Yardım.

+0

proje adı netleştirin. Kod proje isimlerini içermiyor. – leppie

+5

Onlar bir süre geri kırılma noktaları icat ettiler ... –

+1

Yolunuzun uzunluğu 15 chars, s.Length 15 olacak. 2 param ile Substring başlangıç ​​endeksi ve uzunluğu, stop endeksi DEĞİL. Örneğinizde, başlangıç ​​dizininden 15 karakter almayı deniyorsunuz, böylece endeksin dışına çıkmasını sağlıyorsunuz. Substring'i kullanmakta ısrar ederseniz, ikinci parametreyi s.Length - idx olarak değiştirmeniz gerekir, aksi halde aşağıda önerildiği gibi System.IO.Path.GetFileName kullanın. Aklınızdan çıkarmayın, yönteminiz de \ 'i döndürecektir, bu yüzden gerçekten idx + 1, s.Length - idx - 1 –

cevap

14

Dene:

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

evet, işe yarıyor .. Çok hassas. – Karan

+5

projenin adı, derleme adıyla aynı olmak zorunda değildir. –

1

kodu debug mü? İkinci satırın -1'den başka bir değer döndürdüğünden emin misiniz? Dizede ters eğik çizgi bulunmadığında, LastIndexOf, Substring tarafından kullanılabilecek geçerli bir dizin olmayan -1 değerini döndürecek ve bu nedenle 'sınırlar dışı dizin hatası' atılacaktır.

Daha güvenli bir yöntem, Yol sınıfında tanımlanan yöntemleri kullanarak dosya adını ayıklamak olabilir. Ancak, 'proje adının', montaj adıyla aynı olması gerekmediğini unutmayın.

1

Path sınıfını tekerleği yeniden icat etmeye ve alt dizgi dizinlerini manuel olarak hesaplamaya çalışmak yerine kullanın.

1

Yalnızca ikinci parametreyi aramadan Substring'e kaldırın. belgelerine :

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

Bu ayrıca çalışır :-) – Karan

0

Ben senin AssemblyInfo dosyasında AssemblyTitle Özellik erişen çalışacaktı. Herhangi bir meclisin yeri, proje adıyla aynı olmayabilir. Bu deneyin:

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

hth