好吧,所以我并不擅长所有的术语和东西,但到目前为止,我已经创造了如下内容:
1:一个逐字符读取源代码文件内容的应用程序。和;
2:确定字符/字符串'x‘是标识符,还是整数,或者其他什么的应用程序。
第三:另一个应用程序,它将所有内容都放在一起,并创建另一个文件,该文件基本上包含要发送给我的第四个应用程序的指令,大致如下:
将Integer oldValue的值分配给Integer newValue。
然后,我的第四个应用程序接收到这个指令,并“编译”它(在本例中,我只想解释它),然后创建一个应用程序:
int newValue = oldValue;因此,既然我已经完成了解析器等操作,如何将我的指令转换为指令,从而导致实际操作,并生成一个EXE文件,所以当我双击该文件时,它将执行上述操作?
我希望这不会让你感到困惑。
所以,基本上,我想我要问的是:“我如何以编程的方式从一个字符串创建一个”事件“,保存到文件中并生成一个exe?”
发布于 2011-03-06 08:39:10
有几个选项可以从指令列表生成EXE。所有选项都涉及到将指令转换为不同语言的元素。
发布于 2011-03-06 09:04:51
使用我在注释中提供的内容,这是一个简单的可执行创建的真正工作示例:
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);
}
}
}如注释所示,可以在方法块中发出代码。
此外,您还可以使用表达式,而不是使用ILGenerator。
发布于 2011-03-06 08:38:22
在编译阶段,最好使用反射发出API来发出.NET、IL并生成EXE和DLL。
我不想在这里详细介绍所有内容,而是向您介绍下面的MSDN文章为.NET框架创建语言编译器,它包含了一些示例代码,可以帮助您在途中进行操作。
另一个选项包括生成C#代码和使用CodeDOM将代码编译成EXE,这将利用C#编译器作为代码生成和最终二进制生成之间的中间步骤。
https://stackoverflow.com/questions/5209465
复制相似问题