2011-01-31 31 views
6

Tôi đang cố gắng kéo tên dự án bằng cách sử dụng sự phản chiếu, nhưng trong phương thức chuỗi con nó cho tôi "chỉ mục ra khỏi lỗi bị ràng buộc".Thực hiện tên assembly bằng cách sử dụng sự phản chiếu

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

Tôi không hiểu tại sao nó lại gây ra lỗi trên dòng thứ ba.

Trợ giúp Plz.

+0

Làm rõ tên dự án. Mã không chứa tên dự án. – leppie

+5

Họ đã phát minh ra điểm ngắt trong khi quay lại ... –

+1

Nói chiều dài đường dẫn của bạn là 15 ký tự, s.Length sẽ là 15. Chuỗi con với 2 tham số sẽ chấp nhận chỉ mục bắt đầu và độ dài, KHÔNG chỉ số dừng. Vì vậy, trong ví dụ của bạn, bạn đang cố gắng để có được 15 ký tự từ chỉ mục bắt đầu, do đó bạn có được chỉ số ra khỏi bị ràng buộc. Nếu bạn nhấn mạnh vào việc sử dụng chuỗi con, bạn cần phải thay đổi tham số thứ hai thành s.Length - idx thay vào đó, nếu không, hãy sử dụng System.IO.Path.GetFileName như được đề xuất bên dưới. Tâm trí bạn, phương pháp của bạn sẽ trả về \ cũng, vì vậy bạn thực sự muốn idx + 1, s.Length - idx - 1 –

Trả lời

14

Hãy thử:

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

có, nó hoạt động .. Vì vậy, chính xác. – Karan

+5

tên dự án không cần thiết giống như tên lắp ráp. –

1

Bạn đã sửa lỗi mã? Bạn có chắc chắn rằng dòng thứ 2 trả về một giá trị khác -1? Khi không tìm thấy dấu gạch chéo ngược trong chuỗi, LastIndexOf sẽ trả về -1, không phải là chỉ mục hợp lệ có thể được sử dụng bởi Substring và do đó, lỗi 'lập chỉ mục ngoài giới hạn' sẽ được ném.

Phương pháp an toàn hơn là trích xuất tên tệp bằng cách sử dụng các phương thức được xác định trong lớp Đường dẫn. Nhưng, hãy lưu ý rằng 'tên dự án' không nhất thiết phải giống như tên lắp ráp.

1

Sử dụng lớp Path thay vì cố gắng phát minh lại bánh xe và tính chỉ mục chuỗi con theo cách thủ công.

1

Chỉ cần xóa tham số thứ hai khỏi lệnh gọi tới chuỗi con. Từ tài liệu:

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

Điều này cũng hoạt động :-) – Karan

0

Tôi sẽ thử truy cập Thuộc tính AssemblyTitle trong tệp AssemblyInfo của bạn. Vị trí của bất kỳ hội đồng có thể không giống như tên dự án. Hãy thử điều này:

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

hth

Các vấn đề liên quan