C# 编译简单字符串 只是想知道C++或C语言中是否有内置函数,让你在运行时使用编译器?例如,如果我想翻译: !print "hello world";
进入:C# 编译简单字符串 只是想知道C++或C语言中是否有内置函数,让你在运行时使用编译器?例如,如果我想翻译: !print "hello world";,c#,c++,compiler-construction,messagebox,C#,C++,Compiler Construction,Messagebox,进入: 然后生成一个exe,该exe将能够显示上述消息?几年前我在Web上看到了一个样例项目,但是现在已经找不到了。在C++中, < p>在运行时不能使用编译器,但是你可以在你的项目中嵌入一个解释器,比如你总是可以用脏的方式,用Sypor()和调用编译器“GCC…”或者你的等价的< P> > C是可能的。从CodeProject中看一下这个 代码摘录 Nick的建议是好的,但有一个替代方案可能更易于实施(但可能不适用于所有项目)。如果您可以假设您的用户安装了编译器,那么您可以生成一个文件,然后使
然后生成一个exe,该exe将能够显示上述消息?几年前我在Web上看到了一个样例项目,但是现在已经找不到了。在C++中, < p>在运行时不能使用编译器,但是你可以在你的项目中嵌入一个解释器,比如你总是可以用脏的方式,用Sypor()和调用编译器“GCC…”或者你的等价的< P> > C是可能的。从CodeProject中看一下这个 代码摘录
Nick的建议是好的,但有一个替代方案可能更易于实施(但可能不适用于所有项目)。如果您可以假设您的用户安装了编译器,那么您可以生成一个文件,然后使用他们的编译器进行编译。NET framework提供了几个类,您可以通过这些类访问C#和VB.NET的编译器和代码生成器,从而将程序集加载到内存中或生成一个简单的.exe文件。见和 或者,您也可以创建源文件并手动编译它们(对编译器的命令行调用(
system
),即makefiles)
关于你的源代码的翻译:你必须使用这里的正则表达式,或者使用编译器编译器工具,比如COCO/R,YACC等等(注意C++下,代码> Boo::精神也可以非常有用)< P> > C,你可以创建.NET“代码DOM”树,然后使用.NET编译器编译它。这使您能够完全访问.NET的大多数功能
有关详细信息,请参阅“System.CodeDom”名称空间或名称空间。hmmm很有趣,我现在正在检查-非常感谢:)用户是否必须安装C#编译器?或者是.NET附带的?根据,此功能包含在System.dll中。
MessageBox.Show("hello world");
private Assembly BuildAssembly(string code)
{
Microsoft.CSharp.CSharpCodeProvider provider = new CSharpCodeProvider();
ICodeCompiler compiler = provider.CreateCompiler();
CompilerParameters compilerparams = new CompilerParameters();
compilerparams.GenerateExecutable = false;
compilerparams.GenerateInMemory = true;
CompilerResults results = compiler.CompileAssemblyFromSource(compilerparams, code);
if (results.Errors.HasErrors)
{
StringBuilder errors = new StringBuilder("Compiler Errors :\r\n");
foreach (CompilerError error in results.Errors )
{
errors.AppendFormat("Line {0},{1}\t: {2}\n", error.Line, error.Column, error.ErrorText);
}
throw new Exception(errors.ToString());
}
else
{
return results.CompiledAssembly;
}
}
public object ExecuteCode(string code, string namespacename, string classname, string functionname, bool isstatic, params object[] args)
{
object returnval = null;
Assembly asm = BuildAssembly(code);
object instance = null;
Type type = null;
if (isstatic)
{
type = asm.GetType(namespacename + "." + classname);
}
else
{
instance = asm.CreateInstance(namespacename + "." + classname);
type = instance.GetType();
}
MethodInfo method = type.GetMethod(functionname);
returnval = method.Invoke(instance, args);
return returnval;
}