好的,所以我对所有条款和内容都不满意,但这是我迄今为止所创造的内容:
1:一个应用程序,逐个字符地读取源代码文件的内容。和;
2:确定字符/字符串'x'是标识符,整数还是其他内容的应用程序。
和3:另一个将所有内容放在一起的应用程序,并创建另一个文件,基本上包含要发送到我的第4个应用程序的说明,基本上是这样的:
将Integer oldValue的值分配给Integer newValue。
所以,然后我的第4个应用程序接收到这个指令,并“编译”它(好吧,在这种情况下,我会说我只想解释它),然后创建一个应用程序:
int newValue = oldValue;
因此,由于我已经完成了解析器等,我如何将我的指令转换为导致实际操作的指令,并生成一个EXE文件,因此当我双击该文件时,它将执行上述操作动作?
我希望这不会让你感到困惑。
所以,基本上,我想我要问的是:“我如何以编程方式从字符串创建”事件“,将其保存到文件并生成exe?”
答案 0 :(得分:2)
有几种方法可以从指令列表中生成EXE。所有选项都涉及您将指令转换为其他语言的元素。
您可以生成 C#源代码并使用C#编译器编译结果:System.CodeDom
您可以生成 IL说明并将生成的程序集保存到磁盘:System.Reflection.Emit
您可以构建表达式树,而不是生成IL指令:System.Linq.Expressions
答案 1 :(得分:1)
这是使用我在评论中提供的简单可执行文件创建的真实工作示例:
using System;
using System.Reflection;
using System.Reflection.Emit;
namespace AssemblyGenerator
{
partial class AssemblyGenerator
{
static void Main(string[] args)
{
string assemblyName = "Sample";
string exeName = "Sample.exe";
AssemblyBuilder assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName(assemblyName), AssemblyBuilderAccess.Save);
ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule(exeName);
TypeBuilder typeBuilder = moduleBuilder.DefineType(assemblyName, TypeAttributes.Public | TypeAttributes.Class);
MethodBuilder methodBuilder = typeBuilder.DefineMethod("Main", MethodAttributes.Static | MethodAttributes.Public, typeof(void), null);
assemblyBuilder.SetEntryPoint(methodBuilder, PEFileKinds.ConsoleApplication);
ILGenerator ilGenerator = methodBuilder.GetILGenerator();
// BEGIN method IL.
ilGenerator.EmitWriteLine("This shows on console output.");
ilGenerator.Emit(OpCodes.Ret);
// END method IL.
typeBuilder.CreateType();
assemblyBuilder.Save(exeName);
}
}
}
您可以在方法块中发出代码,如注释所示。
此外,您可以使用LambdaExpression.CompileToMethod Method而不是ILGenerator
来使用表达式。
答案 2 :(得分:0)
在编译阶段,最好的方法是使用Reflection Emit APIs发出.NET IL并生成EXE和DLL。
我会指向以下MSDN文章Create a Language Compiler for the .NET Framework,而不是进入这里的所有内容,其中包含可以帮助您的示例代码。
另一个选项包括生成C#代码并使用CodeDOM将代码编译到EXE,这将利用C#编译器作为代码生成和最终二进制生成之间的中间步骤。
答案 3 :(得分:0)
最简单的方法可能是让程序生成某种语言的源代码(例如C)并将其输出到您将单独编译的文件中。这样可以省去必须进行代码生成的麻烦。
根据任务的复杂程度,使用Yacc(和Lex)等工具可能更容易。这些允许您指定如何识别您关注的输入部分以及语言的语法,以及识别构造时要输出的内容。您不必为所有C#指定语法,只需指定您关心任务的部分。