2014-07-04 28 views
-2

我在Reflection C#中工作。如何獲取使用反射C調用方法的每一行指令#

我的需求是指定方法使用反射調用,在調用方法後調用方法獲得以下 。

  1. 註釋行
  2. 執行指令的方法中預先

感謝。

+0

這是不可能的。反思不是關於儀表。你也無法從中獲得評論。這也是非常有趣的 - 你需要什麼信息? –

+0

評論專欄?這些不會被編譯成彙編。誰給你那個taks?執行指令可以通過反編譯或分析MSIL來實現,但不能通過反射。 – Samuel

+0

有API可以獲取調用堆棧。不確定你在這裏尋找什麼。在Visual Studio中,您可以使用自動化來獲取CodeClass和CodeFunction。 – Derek

回答

0

這是不可能的。反射不是關於檢測,而是關於描述類型,方法等的元數據。由於它們不包含在已編譯的程序集中,因此無法從中獲取註釋。

事實上,這樣的深刻洞察運行的程序集是根本不可能的,而不非常非常神奇,就像使用Microsoft.Diagnostics.Runtime

ClrMD是一套先進的API編程方式檢查.NET程序的崩潰轉儲程序與SOS調試擴展(SOS)相同。它允許您爲應用程序編寫自動崩潰分析並自動執行許多常見的調試程序任務。

是還可以附加到自我的過程,並在正常的工作進行分析,所以也許將有可能獲得有關儀器的一些信息。但正如我所說 - 這將是魔術。我相信,你根本不需要那樣做。

1

你所要求的是不可能的,因爲反射不是可以反編譯你的程序集的聖盃。

這是用.NET編寫的程序(Vb,C#,...)或編譯爲IL或中間語言的程序。

那麼,什麼是中間語言?

中間語言(IL)是一種面向對象的編程語言,被設計爲在靜態或動態編譯機器代碼之前由.NET Framework的編譯器使用。 .NET Framework使用IL來生成與機器無關的代碼,作爲編寫以任何.NET編程語言編寫的源代碼的輸出。

IL是一種基於堆棧的彙編語言,在執行虛擬機期間轉換爲字節碼。它由公共語言基礎結構(CLI)規範定義。由於IL用於編譯代碼的自動生成,因此不需要學習其語法。

此術語也稱爲Microsoft中間語言(MSIL)或通用中間語言(CIL)。

例子:

讓我們來看看下面的小應用程序:

using System; 

namespace ConsoleApplication1 
{ 
    // Start class. 
    class Program 
    { 
     // Main entry point. 
     static void Main(string[] args) 
     { 
      Console.WriteLine("Hello, World!"); 
     } 
    } 

}

現在,當您使用了諸如Telerik的JustDecompile,您可以查看應用程序的源代碼:

使用S ystem;

namespace ConsoleApplication1 
{ 
    internal class Program 
    { 
     public Program() 
     { 
     } 

     private static void Main(string[] args) 
     { 
      Console.WriteLine("Hello, World!"); 
     } 
    } 
} 

您會注意到,反編譯器生成的代碼實際上與您最初的代碼不同,但它是相同的技術。

但是添加了一個公共構造函數(即使你沒有在你的類中添加一個構造函數,編譯器添加了一個默認構造函數)。 評論消失了。

現在,這是爲什麼?這是因爲編譯後的exe文件不包含你的代碼,但是隻包含你的代碼翻譯成IL,這是反編譯器將轉換回C#的IL。

那麼,這個IL是怎麼樣的?

.class private auto ansi beforefieldinit ConsoleApplication1.Program 
    extends [mscorlib]System.Object 
{ 
    .method public hidebysig specialname rtspecialname instance void .ctor() cil managed 
    { 
     IL_0000: ldarg.0 
     IL_0001: call instance void [mscorlib]System.Object::.ctor() 
     IL_0006: ret 
    } 

    .method private hidebysig static void Main (
      string[] args 
     ) cil managed 
    { 
     .entrypoint 
     IL_0000: nop 
     IL_0001: ldstr "Hello, World!" 
     IL_0006: call void [mscorlib]System.Console::WriteLine(string) 
     IL_000b: nop 
     IL_000c: ret 
    } 
} 

您看到這已經是一種更接近機器語言的東西。

所以,我希望這說明了爲什麼你不能通過反射得到你的源代碼。