문제

C ++ 또는 C#에 내장 함수가 있는지 궁금해했는데 런타임에 컴파일러를 사용할 수 있습니까? 예를 들어 번역하고 싶다면 :

!print "hello world";

안으로:

MessageBox.Show("hello world");

그런 다음 exe를 생성하여 위의 메시지를 표시 할 수 있습니까? 몇 년 전에 웹 주위에서 샘플 프로젝트를 보았지만 더 이상 찾을 수 없습니다.

도움이 되었습니까?

해결책

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

다른 팁

C ++에서는 런타임에 컴파일러를 사용할 수 없지만 프로젝트에 통역사를 포함시킬 수 있습니다. 고한.

System ()을 사용하여 항상 더러운 방식으로 할 수 있고 컴파일러를 "GCC ..."또는 귀하의 동등한 방법으로 할 수 있습니다.

Nick의 제안은 좋지만 구현하기가 더 간단한 대안이 있습니다 (모든 프로젝트에 적합하지는 않습니다). 사용자에게 컴파일러가 설치되어 있다고 가정 할 수 있다면 파일을 생성 한 다음 컴파일러를 사용하여 컴파일 할 수 있습니다.

.NET-Framework는 C# 및 vb.net의 컴파일러 및 코드 생성기에 액세스 할 수있는 몇 가지 클래스를 제공하여 어셈블리가 메모리에로드되거나 간단한 .exe-file을 제공합니다. 보다 csharpcodeprovider 그리고 이 기사.

또는 소스 파일을 만들고 컴파일 할 수 있습니다. 수동으로 (명령 줄 통화 (system) 컴파일러에 makefiles).

소스의 번역과 관련하여 : 여기서 정규 표현식과 같은 구문 분석 메커니즘을 사용하거나 Coco/R, YACC 등과 같은 컴파일러 컴파일러 도구를 사용해야합니다 (C ++에서 참고하십시오. boost::spirit 또한 매우 유용 할 수 있습니다)

C#에서 .NET "Codedom"트리를 생성 한 다음 .NET 컴파일러를 사용하여 컴파일 할 수 있습니다. 이를 통해 .NET의 대부분의 기능에 완전히 액세스 할 수 있습니다.

"System.Codedom"네임 스페이스 또는 the를 참조하십시오 CodeCompileUnit에 대한 MSDN 도움 자세한 내용은.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top