2015-12-28 22 views
-2

我的意思是,或許有可能使一個程序,它的是否有可能創建一個讀取自己源代碼的程序?

public class PrintOwnSourceCode 
{ 
    public static void Main () 
    { 
     System.Console.WriteLine([something]); 
     // prints "public class PrintOwnSourceCode { public static void Main () { ... } }" 
    } 
} 

相當於???

而且會是反射的例子

+0

已編譯的程序集不包含其源代碼 - 您可以通過反編譯生成功能上等效的源代碼(在許多情況下,語句中的語句與.Net相同),但要尋找一種通用解決方案,將編譯代碼轉換爲源代碼與原始源代碼相同是不可能的。您*可以*構建quines,其唯一目的是打印自己的源代碼,但這更像是一個難題,而不是一個普遍有用的概念。 –

+0

你有這樣做的理由嗎?或者只是好奇?簡短的回答是肯定的,例如一種方法是將源代碼複製到您的部署中,然後從中讀取。 – Quantumplate

回答

2

有點。

反編譯可以做類似的措施: I just decompiled a decompiler so I could use it to decompile itself

.NET反編譯,如[.net反射](http://www.red-gate.com/products/dotnet-development/reflector/)和dotPeek能夠反射在一個.NET組件,併產生類似於源代碼文件的。它看起來不像源代碼,因爲編譯和反編譯就像翻譯英文到法文,然後回到英文 - 結果並不總是保證爲1:1,正如谷歌翻譯可以證明的那樣。信息,如空白,便於閱讀,但編譯器不需要的信息將在反編譯過程中丟失。所以,你的應用程序可以自己反編譯或者調用外部反編譯器來自行打印。


除了

在編譯語言,編譯後的代碼沒有源代碼的直接訪問。 (公司通常不會將源代碼與編譯後的代碼一起發送給客戶,它們只發布編譯後的可執行文件。)當談到像JavaScript這樣的分析語言時,這是一個完全不同的故事。由於源代碼必須可供運行時使用,以便可以解析和運行源代碼,因此代碼始終可以找到它自己的源文件,將其打開並打印出來。

0

這回答here

簡短的答案是,你不能通過反射來打印它。

如果你想打印出來的文件,那麼你將需要加載源文件本身(並有文件可用)。

+0

然後,ASP.NET MVC如何在程序內查看控制器類的名稱並使用這些名稱來配置路由? –

+1

@SubparWebDev - Reflection允許查看類的元數據(類名,屬性,方法等)。它不公開源代碼。 我不知道ASP.NET MVC如何在封面下工作的所有細節(雖然網上有很多材料)。我會說它不需要源代碼來執行它的工作。它可以使用反射來確定控制器名稱和ActionResults的各種方法。 –

相關問題