Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 编译简单字符串 只是想知道C++或C语言中是否有内置函数,让你在运行时使用编译器?例如,如果我想翻译: !print "hello world";_C#_C++_Compiler Construction_Messagebox - Fatal编程技术网

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