2008-09-24 5 views
15

nasıl programlı kaynak dosya adını ve satır numarası almak için burada bir tür ya da Bir türün bir üyesi bildirildi.Kaynak dosya adı ve bir üye üyenin satır numarası nasıl alınır? ayıklama veri dosyası (PDB) mevcuttur ve <strong>System.Reflection</strong> veya başka bir benzer bir çerçeve gibi <strong>Mono.Cecil</strong> birini kullanarak olduğu göz önüne alındığında

MethodInfo methodInfo = typeof(Foo).GetMethod("SayHello"); 
string sourceFileName = methodInfo.GetSourceFile(); // ?? Does not exist! 
int sourceLineNumber = methodInfo.GetLineNumber(); // ?? Does not exist! 
: böyle bir şey yapmak nasıl

1: public class Foo 
2: { 
3:  public string SayHello() 
4:  { 
5:   return "Hello"; 
6:  } 
7: } 

Foo.cs \ Projem \:

C: Örneğin

, Diyelim ki bir derleme bu dosyayı derledik diyelim

sourceFileName "C: \ MyProject \ Foo.cs" öğesini ve sourceLineNumber 3 değerini eşittir.

Güncelleme: System.Diagnostics.StackFrame gerçekten bu bilgi almak mümkün, ancak geçerli yürütme çağrı yığını kapsamında sadece. Bu, yöntemin önce çağrılması gerektiği anlamına gelir. Ben aynı bilgiyi almak istiyorum ama tip üyesini çağırmadan.

bu bağlantılara biraz yardım bulabilirsiniz
+0

, gerek PDB okuyucu kullanmak daha fazla, cevabıma bakın –

cevap

7

, belirli bir tip üye kod konumunu elde etmek mümkün olur.kaynak kodunda bir örnek uygulamasını bakınız.tarih yöntemine kadar

+0

Yann, CCI hala bir şey, ancak Gallio Projesi kapatıldı. Son kaynak kodu GitHub'da bulunabilir (https://github.com/Gallio), ama hangi bölümden bahsettiğinizi söylemenin bir yolu yoktur. Burada kaynak kodu sağlamayı düşünebilir misiniz, ya da atıfta bulunduğunuz uygulama hangi dosyada bulunduğuna dair bir gösterge olabilir mi? –

1

:

Getting file and line numbers without deploying the PDB files

aynı zamanda (bu şu

post "Merhaba Mark,

şu size kod satırı sayısını verecektir bulundu kaynak dosyası):

İlgilendiğiniz durumda, tüm arayanların yanı sıra olduğunuz rutin hakkında bilgi edinebilirsiniz. Eğer genel bir hata rutini istiyorsanız (Hatanın oluştuğu olurdu) arayanın adını almak çünkü

Public Function MeAndMyCaller As String 
    Dim CurrentStack As New System.Diagnostics.StackTrace 
    Dim Myself As String = CurrentStack.GetFrame(0).GetMethod.Name 
    Dim MyCaller As String = CurrentStack.GetFrame(1).GetMethod.Name 
    Return "In " & Myself & vbCrLf & "Called by " & MyCaller 
End Function 

Bu

çok kullanışlı olabilir.

Selamlar, Fergus MVP [Windows Başlat düğmesi, Kapatma diyalog] "

+2

Ne yazık ki, StackTrace mevcut çağrı yığını hakkında bilgi sağlar; ve keyfi bir harici üye hakkında değil. Yöntemi gerçekten çalıştırmadan bilgileri almak istiyorum. –

+0

Richard, meşgul kod bağlantısı bozuk. Herhangi bir yerde güncel bir bağlantı var mı? –

12

:

private static void Log(string text, 
         [CallerFilePath] string file = "", 
         [CallerMemberName] string member = "", 
         [CallerLineNumber] int line = 0) 
{ 
    Console.WriteLine("{0}_{1}({2}): {3}", Path.GetFileName(file), member, line, text); 
} 

Yeni Framework API argümanları dolduran zamanında (özel nitelikler ile işaretli), my answer to this SO question

+0

Sadece .Net 4.5 için geçerlidir. Kurumsal projeler için büyük dezavantaj. – Kobor42

+5

Sanırım soruyu temel olarak yanlış anladınız. Arayan hakkında nasıl bilgi edinildiğini gösterdiniz, ancak soru herhangi bir sembol için nasıl sorgulanacağını soruyor. Yann Trevin'in ricasını Richard'ın cevabına bakın. –

1

daha yapıcı içinde yöntemlerden biri yukarıda açıklandığı kullanma bir öznitelik, bir özniteliğe sahip olabilecek her şeyin kaynak konumunu sağlayabilir - örneğin bir sınıf.

sealed class ProvideSourceLocation : Attribute 
    { 
     public readonly string File; 
     public readonly string Member; 
     public readonly int Line; 
     public ProvideSourceLocation 
      (
      [CallerFilePath] string file = "", 
      [CallerMemberName] string member = "", 
      [CallerLineNumber] int line = 0) 
     { 
      File = file; 
      Member = member; 
      Line = line; 
     } 

     public override string ToString() { return File + "(" + Line + "):" + Member; } 
    } 


[ProvideSourceLocation] 
class Test 
{ 
    ... 
} 

Eğer örneğin yazabilirsiniz: Aşağıdaki nitelik sınıfı Bkz

Console.WriteLine(typeof(Test).GetCustomAttribute<ProvideSourceLocation>(true)); 

Çıktı olacaktır: Yeni API bunun için vardır

a:\develop\HWClassLibrary.cs\src\Tester\Program.cs(65): 
İlgili konular