지금 프로젝트를 진행하고 있으며 팀에서 전체 프로젝트를 다시 컴파일하지 않고도 코드를 작성하고 편집 할 수있는 방법을 원하기 때문에 스크립팅 엔진을 구현하고 구현하기로 결정했습니다. .CompilerParameters를 사용하여 현재 어셈블리 참조
이전에 Lua를 C++로 구현 한 적이 있었지만 프로젝트에 스크립팅 기능을 구현하는 데는 완전히 초보자가 아니 었습니다. 그러나 우리는 C#에 이미 내장 된 System.Reflection과 결합 된 Microsoft.CSharp 네임 스페이스를 사용하여 직선적 인 C#을 구현하려고했습니다.
이렇게 들었을 때, 저는 문서에서 찌르고 저는 ALMOST가 작동하는 프로토 타입을 제안했습니다. 스크립트 작성 및 구문 분석하도록 - (따라서 스크립팅 네임 스페이스 내부 및 현재 조립) IScript.cs -
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.CSharp;
using System.CodeDom.Compiler;
using System.Reflection;
namespace Scripting
{
class Program
{
static void Main(string[] args)
{
StringBuilder builder = new StringBuilder();
builder.Append("using System;");
builder.Append("using Scripting;");
builder.Append("class MyScript : IScript");
builder.Append("{");
builder.Append(" string ScriptName");
builder.Append(" {");
builder.Append(" get { return \"My Script\"; }");
builder.Append(" }");
builder.Append(" public bool Initialize()");
builder.Append(" {");
builder.Append(" Console.WriteLine(\"Hello, World!\");");
builder.Append(" return true;");
builder.Append(" }");
builder.Append("}");
CSharpCodeProvider provider = new CSharpCodeProvider();
CompilerParameters param = new CompilerParameters(new string[] { "System.dll", "Scripting.dll" });
param.GenerateInMemory = true;
param.GenerateExecutable = true;
CompilerResults result = provider.CompileAssemblyFromSource(param, builder.ToString());
if (result.Errors.Count > 0)
{
foreach (CompilerError error in result.Errors)
Console.WriteLine(error);
Console.ReadKey();
return;
}
}
}
}
내가 지금이 문제는 내 인터페이스를 참조 할 수 있도록하려는 것입니다 컴파일러에서 액세스 할 수 있습니다. 분명히 Scripting.dll을 매개 변수로 추가했지만 어떤 이유로 든 액세스 할 수없는 것 같습니다. I 디버그에서 실행 중이므로 일부 주요 facepalmage가 발생할 수 있습니다. 뭐라구?
현재 어셈블리를 참조하여 CompilerParameters에 전달하는 방법이 있습니까? 아니면 내가/스크립트 개체에 대한 어셈블리를 만드는 데 의존해야한다/난 정말 망했어/등?
스크립트가 모두 한 줄에; AppendLine()을 호출하는 것을 고려해보십시오. (그것이 어떤 차이를 만들지는 않는다) – SLaks