编译简单字符串

问题描述 投票:0回答:6

只是想知道 c++ 或 c# 中是否有内置函数可以让您在运行时使用编译器?例如,如果我想翻译:

!print "hello world";

进入:

MessageBox.Show("hello world");

然后生成一个exe,然后就可以显示上面的消息了?几年前我在网上看到过这样做的示例项目,但现在找不到了。

c# c++ compilation messagebox
6个回答
18
投票

可以使用C#。看看 CodeProject 中的这个示例项目

代码摘录

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;
}

5
投票

在 C++ 中,您不能在运行时使用编译器,但您可以在项目中嵌入解释器,例如 CINT。


3
投票

你总是可以用肮脏的方式来做到这一点,使用 system() 并调用编译器“gcc ...”或你的等效方法


1
投票

尼克的建议很好,但是有一个替代方案可能更容易实现(但可能并不适合所有项目)。 如果您可以假设您的用户安装了编译器,您可以生成一个文件,然后使用他们的编译器进行编译。


1
投票

.NET 框架提供了一些类,使您可以访问 C# 和 VB.NET 的编译器和代码生成器,从而生成加载到内存中的程序集或简单的 .exe 文件。请参阅 CSharpCodeProvider本文

或者,您也可以只创建源文件并手动编译它们(对编译器、makefile 的命令行调用 (

system
))。

关于源代码的翻译:您必须在这里使用正则表达式等解析机制,或者使用 Coco/R、yacc 等编译器-编译工具。(请注意,在 C++ 下,

boost::spirit
也非常有用)


1
投票

在 C# 中,您可以创建一个 .NET“CodeDom”树,然后使用 .NET 编译器对其进行编译。这使您可以完全访问 .NET 的大多数功能。

有关详细信息,请参阅“System.CodeDom”命名空间或 CodeCompileUnit 的 MSDN 帮助

© www.soinside.com 2019 - 2024. All rights reserved.