我需要创建一个程序来创建另一个程序但不是编译器。
例如,
我编写了一个接受用户输入字符串的程序。假设用户输入“Pluto”。然后,该程序应该创建一个单独的.exe,在执行时会显示“Hello Pluto”。
我该怎么做?如果您可以在C#和Windows Forms中提供示例,那就更好了。
感谢。
答案 0 :(得分:14)
基本上是编译器 - 只是为了一种特别简单的语言。
如果你能用C#表达最终的程序,最简单的解决方案可能是使用CSharpCodeProvider。这就是我为Snippy所做的,这是一个帮助C#深度轻松运行代码片段的小工具。 Snippy的源代码是on the C# in Depth web site,可以让你知道你可能会做什么 - 基本上你只是希望它将可执行文件写入文件而不是在内存中构建它。
或者,查看MSDN docs,其中包含生成可执行文件的示例。
答案 1 :(得分:11)
您要查找的类位于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秒)
答案 2 :(得分:3)
暂时,您也可以通过使用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。这是非常有趣但却非常繁琐的工作。
我没有尝试运行上面的代码。但是我知道它就是这样的,因为我做了类似的事情已经有一段时间了。
答案 3 :(得分:0)
使用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
答案 4 :(得分:0)
最简单的方法是创建(提前)一个非常简短的简单程序,该程序从自身读取资源并打印出来。然后您的应用程序只需要将该程序二进制文件放在某个位置的磁盘上,并调用UpdateResource函数来更改字符串。 .NET也有资源支持,但我不知道任何与UpdateResource直接对应的函数。