创建另一个程序的程序

问题描述:

我需要创建一个程序来创建另一个程序,但不是编译器。创建另一个程序的程序

例如,

我编写了一个程序,该程序接受来自用户的字符串输入。假设用户输入“Pluto”。这个程序应该在执行时创建一个单独的.exe文件,上面写着“Hello Pluto”。

我该怎么做?如果你可以在C#和Windows窗体中给出例子,那就更好了。

谢谢。

+5

你能告诉我们你到目前为止完成了这项家庭作业吗? – 48klocs 2010-06-11 21:00:11

+4

看起来很像一个代码为我的问题... – Dykam 2010-06-11 21:01:48

+7

我想把“这不是家庭作业”,但我想你们会给我的怀疑的好处。我已经27岁了。这不是“为我编码”的问题。我面对的问题真的很大,但我将问题简化为上面的简单问题。 – zaidwaqi 2010-06-11 21:03:41

基本上,一个编译器 - 只是一个特别简单的语言。

如果你可以在C#中表达最终的程序,最简单的解决方案可能是使用CSharpCodeProvider。这就是我为Snippy所做的,这是一个帮助C#深度运行代码片段的小工具。 Snippy的源代码是on the C# in Depth web site,可以让你知道你可能会做什么 - 基本上你只是希望它将可执行文件写入文件而不是将其构建在内存中。

或者,查看MSDN docs,它们有一个生成可执行文件的示例。

+0

@Downvoters:小心给个理由? – 2010-06-11 21:02:57

+0

upvoted只是为了它。如果你仔细查看头版,有人只是低估了他所看到的一切。 – Femaref 2010-06-11 21:04:26

+2

降低了一切。看看问题列表。许多优秀的问题都被低估了。请停止那个机器人! – 2010-06-11 21:07:14

你正在寻找的类是在Microsoft.CSharp命名空间

CSharpCodeProvider codeProvider = new CSharpCodeProvider(); 
ICodeCompiler icc = codeProvider.CreateCompiler(); 
System.CodeDom.Compiler.CompilerParameters parameters = new CompilerParameters(); 
parameters.GenerateExecutable = true; 
parameters.OutputAssembly = Output; 
CompilerResults results = icc.CompileAssemblyFromSource(parameters,SourceString); 

(通过使用谷歌发现microsoft support - 只需要不到20秒)

+3

谨慎给出downvote的原因? – Femaref 2010-06-11 21:03:31

+0

人们低估正确的答案让我想downvote那些downvoters。 – Dykam 2010-06-11 21:06:38

+0

请不要在有关谷歌的答案中使用光顾文本。整个*.com的重点是不使用谷歌,并在这里有一个编码参考。否则,为什么我们不都只是使用谷歌? – 2010-09-19 12:12:22

试探性,还可以实现这一目标throught他用System.Reflection.Emit命名空间中的东西,我相信可以通过使用LINQ表达式树来提供方法的实现。这是一种利落:

var assembly = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName("TestAssembly"), AssemblyBuilderAccess.RunAndSave); 
var mod = assembly.DefineDynamicModule("TestModule"); 
var type = mod.DefineType("TestType"); 
var method = type.DefineMethod("Increment", MethodAttributes.Public, typeof(int), Type.EmptyTypes); 
Expression<Func<int, int>> inc = (a) => a + 1; // this is cool 
inc.CompileToMethod(method); 

它看起来起初有点令人生畏,但它确实很酷的东西,你让编译器产生硬的东西,该方法的具体实现。但是你不能真的创造这样的领域,这将需要一些IL。这是非常有趣,但真正枯燥的工作。

免责声明:

我还没有试过运行上面的代码。但我知道事情就是这样,自从我做了那样的事情之后,我已经有一段时间了。

使用Reflection.Emit。

http://msdn.microsoft.com/en-us/library/8ffc3x75.aspx

http://www.codeproject.com/KB/cs/DynamicCodeGeneration2.aspx

如何建立使用Reflection.Emit的HelloWorld.exe的一个(这是不到一半的代码页): http://blogs.msdn.com/b/joelpob/archive/2004/01/21/61411.aspx

做将是最简单的事情(预先)创建一个非常简短的程序,从自己读取资源并打印它。然后,您的应用程序只需将该程序二进制文件放置在某个磁盘上,然后调用UpdateResource函数更改该字符串。 .NET也有资源支持,但我不知道任何直接对应于UpdateResource的函数。