2012-06-09 5 views
5

Jak znaleźć ścieżkę do pliku .cs według jej typu?Jak znaleźć ścieżkę do pliku .cs według jej typu w C#

Prototyp funkcji:

string FindPath(Type);

Zwraca coś jak "C: \ Projects \ ..... \ MyClass.cs"

+0

Dlaczego potrzebne? Nie jestem pewien, czy jest to możliwe w czasie wykonywania, ponieważ cały kod jest kompilowany w zespole. – alexn

+0

Zatrzymaj aplikację (debugowanie + zatrzymaj debugowanie) i odbuduj projekt. – adatapost

Odpowiedz

2

Wszystkie zajęcia się skompilowane w zespołach (.exe lub .dll). Nie sądzę, że możesz uzyskać ścieżkę do pliku źródłowego klasy, ponieważ ta klasa może nawet nie istnieć (jeśli skopiowałeś plik .exe na inną maszynę).

Ale można uzyskać ścieżkę do bieżącego złożenia (pliku .exe), który jest uruchomiony. Sprawdź tę odpowiedź: Get the Assembly path C#

string file = (new System.Uri(Assembly.GetExecutingAssembly().CodeBase)).AbsolutePath; 
+1

Ta odpowiedź powinna zostać usunięta lub przekonwertowana na komentarz. –

+0

@ChrisMarisic Nie zgadzam się, jest to poprawna odpowiedź z odpowiednimi informacjami i dobrym wyjaśnieniem, dlaczego nie jest to możliwe. – ForceMagic

6

to nie jest możliwe, nie ma takiej relacji. Klasa może być częściowa, więc może pochodzić nawet z kilku różnych plików źródłowych.

+0

Prawdopodobnie masz rację ... dzięki – satellite

+0

Wydaje mi się, że jest to możliwe z kompilacją Debugowania, ponieważ przechowywanych jest wystarczająco dużo informacji debugowania, aby pokazać nazwę pliku i numer wiersza w śladach stosu (np. Http://msdn.microsoft .com/en-us/library/system.diagnostics.stacktrace.aspx). Nie wiem jednak, jak uzyskać dostęp do tych informacji. –

+2

@TimS .: Informacje dotyczące debugowania są dostępne, więc można je w jakiś sposób wykopać, ale plik źródłowy można pobrać tylko na jedno oświadczenie, a nie na klasę. – Guffa

12

w .NET 4.5 można użyć atrybutu CallerFilePath odbicia (z MSDN):

// using System.Runtime.CompilerServices 
// using System.Diagnostics; 

public void DoProcessing() 
{ 
    TraceMessage("Something happened."); 
} 

public void TraceMessage(string message, 
     [CallerMemberName] string memberName = "", 
     [CallerFilePath] string sourceFilePath = "", 
     [CallerLineNumber] int sourceLineNumber = 0) 
{ 
    Trace.WriteLine("message: " + message); 
    Trace.WriteLine("member name: " + memberName); 
    Trace.WriteLine("source file path: " + sourceFilePath); 
    Trace.WriteLine("source line number: " + sourceLineNumber); 
} 

// Sample Output: 
// message: Something happened. 
// member name: DoProcessing 
// source file path: c:\Users\username\Documents\Visual Studio 2012\Projects\CallerInfoCS\CallerInfoCS\Form1.cs 
// source line number: 31 

Patrz: http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.callerfilepathattribute(v=vs.110).aspx

+0

Można tego użyć do śledzenia lokalizacji plików, wykonując coś na wzór 'public HomeController(): base (TraceFileLocation())', gdzie klasa bazowa zapisuje lokalizacje. Jeśli robisz to na poziomie instancji, możesz chcieć buforować wartości '[CallerFilePath]' w zbiorze statycznym, aby zapobiec niepotrzebnej pracy, jeśli analizujesz ścieżki (które spodziewałem się uzyskać wartość poza to) –

Powiązane problemy