回答
這是不可能的。反射不是關於檢測,而是關於描述類型,方法等的元數據。由於它們不包含在已編譯的程序集中,因此無法從中獲取註釋。
事實上,這樣的深刻洞察運行的程序集是根本不可能的,而不非常非常神奇,就像使用Microsoft.Diagnostics.Runtime
:
ClrMD是一套先進的API編程方式檢查.NET程序的崩潰轉儲程序與SOS調試擴展(SOS)相同。它允許您爲應用程序編寫自動崩潰分析並自動執行許多常見的調試程序任務。
是還可以附加到自我的過程,並在正常的工作進行分析,所以也許將有可能獲得有關儀器的一些信息。但正如我所說 - 這將是魔術。我相信,你根本不需要那樣做。
你所要求的是不可能的,因爲反射不是可以反編譯你的程序集的聖盃。
這是用.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
}
}
您看到這已經是一種更接近機器語言的東西。
所以,我希望這說明了爲什麼你不能通過反射得到你的源代碼。
- 1. 如何使用反射調用方法
- 2. 無法獲取父類調用子類方法 - 使用反射
- 3. 獲取使用反射方法的調用層次結構
- 4. 使用反射獲取OrderBy方法
- 5. 使用反射獲取方法描述
- 6. 使用反射獲取類方法
- 7. 使用Java反射類獲取方法
- 8. 在C#運行時使用反射調用ToList()方法#
- 9. 如何獲取使用反射的方法的參數
- 10. 使用反射的Java調用方法
- 11. 使用反射的調用方法
- 12. 使用反射的調用方法
- 13. 如何調用反射方法
- 14. C#反射,獲取重載方法
- 15. 使用反射調用方法
- 16. 使用反射動態調用方法
- 17. 使用反射調用方法列表
- 18. Android/Java:使用反射調用方法?
- 19. 使用反射調用靜態方法
- 20. C#使用反射獲取parms的值
- 21. C#使用反射來獲取方法名
- 22. c#使用反射從底層類型獲取方法名稱
- 23. 反射:如何從使用反射調用的方法獲得結果(並對其進行foreach)?
- 24. 如何使用反射來重構按名稱獲取方法?
- 25. 一種獲取字段值而不使用反射的方法
- 26. C#反射調用方法與參考/指針參數
- 27. 如何調用使用反射的數組的方法
- 28. 如何調用指令外的方法?
- 29. 使用反射C調用靜態類的方法#
- 30. 如何使用反射調用動態對象的方法
這是不可能的。反思不是關於儀表。你也無法從中獲得評論。這也是非常有趣的 - 你需要什麼信息? –
評論專欄?這些不會被編譯成彙編。誰給你那個taks?執行指令可以通過反編譯或分析MSIL來實現,但不能通過反射。 – Samuel
有API可以獲取調用堆棧。不確定你在這裏尋找什麼。在Visual Studio中,您可以使用自動化來獲取CodeClass和CodeFunction。 – Derek