2012-05-18 2 views
9

지금 프로젝트를 진행하고 있으며 팀에서 전체 프로젝트를 다시 컴파일하지 않고도 코드를 작성하고 편집 할 수있는 방법을 원하기 때문에 스크립팅 엔진을 구현하고 구현하기로 결정했습니다. .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에 전달하는 방법이 있습니까? 아니면 내가/스크립트 개체에 대한 어셈블리를 만드는 데 의존해야한다/난 정말 망했어/등?

+0

스크립트가 모두 한 줄에; AppendLine()을 호출하는 것을 고려해보십시오. (그것이 어떤 차이를 만들지는 않는다) – SLaks

답변

5

아마도 잘못된 디렉토리를 찾고있을 것입니다.

typeof(Program).Assembly.CodeBase을 전달하면 전체 경로를 전달할 수 있습니다.

0
당신은 실행 파일을 얻을 데는 CompilerParameters에 전달할 수

:

 string exeName = Assembly.GetEntryAssembly().Location;  
     param.ReferencedAssemblies.Add(exeName);