2009-05-14 44 views
42

Làm cách nào để lấy đường dẫn của cụm hiện tại? Tôi cần phải nhận được dữ liệu từ một số đường dẫn liên quan đến vị trí lắp ráp hiện tại hte (.dll).Lấy đường dẫn của cụm lắp ráp hiện tại

Tôi nghĩ có người đã bảo tôi sử dụng không gian tên phản chiếu nhưng tôi không thể tìm thấy bất kỳ thứ gì trong đó.

+1

Assembly.GetExecutingAssembly() Vị trí – RichieHindle

Trả lời

72

Bạn có thể sử dụng:

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

Một số gợi ý trong các ý kiến ​​là để vượt qua mà qua System.Uri.UnescapeDataString(từ vvnurmi) để đảm bảo rằng bất kỳ phần trăm mã hóa được xử lý, và sử dụng Path.GetFullpath(từ TrueWill) để đảm bảo rằng đường dẫn ở dạng Windows chuẩn (thay vì có dấu gạch chéo thay vì dấu gạch chéo ngược). Dưới đây là một ví dụ về những gì bạn nhận được ở từng giai đoạn:

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 + "]"); 

Output nếu chúng ta đang chạy C:\Temp\Temp App\bin\Debug\TempApp.EXE:

 
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

Tôi khuyên bạn nên gọi Path.GetFullPath để chuyển các dấu gạch chéo về phía trước thành các dấu gạch chéo ngược. Bạn có thể nhận được hành vi kỳ lạ từ Assembly.LoadFile (chẳng hạn như các loại không equating) khi sử dụng dấu gạch chéo về phía trước. – TrueWill

+3

Lợi thế/mục đích của việc sử dụng điều này thay vì '.Location' là gì? (Tôi nghi ngờ phải có lý do, nhưng nó giúp tôi.) –

+4

@pst: Tùy thuộc vào môi trường, Vị trí có thể không chính xác, vì việc sao chép bóng có thể "di chuyển" hội đồng trước khi thực thi. –

44
+13

+1 cho liên kết tài liệu.8-) – RichieHindle

+0

Điều này cho biết vị trí của mscorlib, chứ không phải là lắp ráp của bạn, khi được gọi từ một thử nghiệm đơn vị MSTest. –

6

Chỉ cần để làm cho nó rõ ràng:

Assembly.GetExecutingAssembly().Location 
+0

+1: Nghi ngờ là xấu. – RichieHindle

2

tôi thích

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

EscapedCodeBase bao gồm các kịch bản mà con đường địa phương của bạn có thể có một không hợp lệ URI char trong đó (xem https://stackoverflow.com/a/21056435/852208)

LocalPath bao gồm đường dẫn đầy đủ cho cả đường dẫn cục bộ và đường dẫn unc, trong đó AbsolutePath cắt bớt "\\ server"

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