2015-12-28 26 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的各种方法。 –

相关问题