2011-02-08 2 views
3

Хорошо, я сначала признаюсь, что не знаю правильной терминологии для всего этого, поэтому извиняюсь, если это уже рассмотрено, и я просто не использую соответствующие слова.Недавно построенный доступ к C# Ассамблеи к предопределенным функциям

Я пытаюсь создать программу на C#, которая позволит C# -коду, скомпилированному программой, выступать в качестве языка сценариев.

Вот мой пример кода для программы, которая загружает и компилирует код:

using Microsoft.CSharp; 
using System; 
using System.CodeDom.Compiler; 
using System.Collections.Generic; 
using System.IO; 
using System.Reflection; 

namespace RuntimeCompilation 
{ 
    public class Program 
    { 
     public static void Main(string[] args) 
     { 
      Program b = new Program(); 
      CompilerResults results = b.BuildAssembly("Class1.cs"); // compiles the class 

      if (results.Errors.Count > 0) 
      { 
       System.Console.Out.WriteLine("Errors Follow:"); 
       String ErrorText = ""; 
       foreach (CompilerError CompErr in results.Errors) 
       { 
        ErrorText = ErrorText + 
         "Line number " + CompErr.Line + 
         ", Error Number: " + CompErr.ErrorNumber + 
         ", '" + CompErr.ErrorText + ";" + 
         Environment.NewLine + Environment.NewLine; 
       } 
       System.Console.Out.WriteLine(ErrorText); 
      } 
      else 
      { 
       Assembly assembly = results.CompiledAssembly; 
       foreach (Type type in assembly.GetTypes()) 
       { 
        System.Console.WriteLine("Type found: " + type.FullName); 
        System.Console.WriteLine("Creating Instance:"); 
        System.Console.WriteLine("======================="); 
        assembly.CreateInstance(type.FullName); 
        System.Console.Out.WriteLine("======================="); 
        System.Console.Out.WriteLine("Done"); 
       } 
      } 
      System.Console.Out.WriteLine("DONE."); 
     } 

     // Compile a file of source and return the CompilerResults object. 
     private CompilerResults BuildAssembly(string filename) 
     { 
      TextReader tr = new StreamReader(filename); 
      string code = tr.ReadToEnd(); 
      CSharpCodeProvider provider = new CSharpCodeProvider(); 
      CompilerParameters compilerparams = new CompilerParameters(); 
      compilerparams.GenerateExecutable = false; 
      compilerparams.GenerateInMemory = true; 
      return provider.CompileAssemblyFromSource(compilerparams, code); 
     } 

     public bool iCanHasAccess() 
     { 
      return true; 
     } 
    } 
} 

А вот класс он строит:

using System; 
using RuntimeCompilation; 

namespace RuntimeCompilation 
{ 
    public class Class1 
    { 
     public Class1() 
     { 
      System.Console.WriteLine("This was instancialized"); 
      if (Program.iCanHasAccess()) 
       System.Console.WriteLine("I have access"); 
     } 
    } 
} 

ошибка, выводимый программой является то, что имя Программа не существует в текущем контексте. Как я могу гарантировать, что программа «скрипт» имеет доступ к функциям и членам программы компиляции?

Я пытаюсь разрешить простой путь с минимальными затратами времени выполнения, чтобы пользователи могли изменять поведение компонента внутри программы, не требуя перестройки. Если это невозможно с помощью сборки C#, я, скорее всего, буду использовать LUA, но я бы хотел этого избежать. Поскольку я хотел бы, чтобы этот продукт работал на XBox360, требуя компиляции проекта WHOLE и скриптов вместе перед развертыванием через XNA.

+0

Отъезд 'Mono.CSharp.Evaluator' - у него есть услуги компилятора, вы можете оценить строки исходного кода с этим. –

+0

Microsoft.CSharp.CSharpCodeProvider аналогичным образом, как показано в предоставленном источнике, также среда Mono не поддерживает развертывание XNA для XBox360. – acp10bda

ответ

4

Вам нужна ссылка на текущую сборку, то есть что-то вроде:

compilerparams.ReferencedAssemblies.Add("my.dll"); // or .exe 

однако - следующий будет по-прежнему не:

 if (Program.iCanHasAccess()) 
      System.Console.WriteLine("I have access"); 

потому что iCanHasAccess() является экземпляр метод, а не метод static.

+0

Да, я заметил это, я имел в виду, что это публичная статика. Итак, как я могу добавить свою программу в качестве ссылки? – acp10bda

+0

Глупое ограничение времени на редактирование ... То есть, что происходит вместо «my.dll», чтобы гарантировать, что Программа доступна? Возможно ли это, или я должен сделать другую сборку, на которой размещены функции, доступные для скриптов ... и как я могу использовать сценарии для изменения состояний объектов в программе? – acp10bda

+0

Ничего, я понял, что делать. Большое спасибо за эту помощь. – acp10bda

Смежные вопросы