创建另一个程序的程序
我需要创建一个程序来创建另一个程序,但不是编译器。创建另一个程序的程序
例如,
我编写了一个程序,该程序接受来自用户的字符串输入。假设用户输入“Pluto”。这个程序应该在执行时创建一个单独的.exe文件,上面写着“Hello Pluto”。
我该怎么做?如果你可以在C#和Windows窗体中给出例子,那就更好了。
谢谢。
基本上,是一个编译器 - 只是一个特别简单的语言。
如果你可以在C#中表达最终的程序,最简单的解决方案可能是使用CSharpCodeProvider。这就是我为Snippy所做的,这是一个帮助C#深度运行代码片段的小工具。 Snippy的源代码是on the C# in Depth web site,可以让你知道你可能会做什么 - 基本上你只是希望它将可执行文件写入文件而不是将其构建在内存中。
或者,查看MSDN docs,它们有一个生成可执行文件的示例。
@Downvoters:小心给个理由? – 2010-06-11 21:02:57
upvoted只是为了它。如果你仔细查看头版,有人只是低估了他所看到的一切。 – Femaref 2010-06-11 21:04:26
降低了一切。看看问题列表。许多优秀的问题都被低估了。请停止那个机器人! – 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秒)
试探性,还可以实现这一目标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的函数。
你能告诉我们你到目前为止完成了这项家庭作业吗? – 48klocs 2010-06-11 21:00:11
看起来很像一个代码为我的问题... – Dykam 2010-06-11 21:01:48
我想把“这不是家庭作业”,但我想你们会给我的怀疑的好处。我已经27岁了。这不是“为我编码”的问题。我面对的问题真的很大,但我将问题简化为上面的简单问题。 – zaidwaqi 2010-06-11 21:03:41