간단한 문자열을 컴파일하십시오
-
20-09-2019 - |
문제
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 도움 자세한 내용은.