Скриптинг с C#?

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

Есть ли исполняемый файл, который принимает файл.cs и запускает его на языке Python?

4 ответа

Вы можете сделать что-то вроде этого (создать консольное приложение с кодом, похожим на этот)

...
using System.Reflection;
using System.CodeDom.Compiler;
...

namespace YourNameSpace
{
  public interface IRunner
  {
    void Run();
  }

  public class Program
  {
    static Main(string[] args)
    {
      if(args.Length == 1)
      {
        Assembly compiledScript = CompileCode(args[0]);
        if(compiledScript != null)
          RunScript(compiledScript);
      }
    }

    private Assembly CompileCode(string code)
    {
      Microsoft.CSharp.CSharpCodeProvider csProvider = new 
Microsoft.CSharp.CSharpCodeProvider();

      CompilerParameters options = new CompilerParameters();
      options.GenerateExecutable = false;
      options.GenerateInMemory = true;

      // Add the namespaces needed for your code
      options.ReferencedAssemblies.Add("System");
      options.ReferencedAssemblies.Add("System.IO");
      options.ReferencedAssemblies.Add(Assembly.GetExecutingAssembly().Location);

      // Compile the code
      CompilerResults result;
      result = csProvider.CompileAssemblyFromSource(options, code);

      if (result.Errors.HasErrors)
      {
        // TODO: Output the errors
        return null;
      }

      if (result.Errors.HasWarnings)
      {
        // TODO: output warnings
      }

      return result.CompiledAssembly;
    }

    private void RunScript(Assembly script)
    {
      foreach (Type type in script.GetExportedTypes())
      {
        foreach (Type iface in type.GetInterfaces())
        {
          if (iface == typeof(YourNameSpace.Runner))
          {
            ConstructorInfo constructor = type.GetConstructor(System.Type.EmptyTypes);
              if (constructor != null && constructor.IsPublic)
              {
                YourNameSpace.IRunner scriptObject = constructor.Invoke(null) as 
YourNameSpace.IRunner;

                if (scriptObject != null)
                {
                  scriptObject.Run();
                }
                else
                {
                  // TODO: Unable to create the object
                }
              }
              else
              {
                // TODO: Not implementing IRunner
              }
            }
          }
        }
      }
  }
}

После создания этого консольного приложения вы можете запустить его следующим образом из командной строки:

YourPath:\> YourAppName.exe "public class Test : IRunnder { public void Run() { 
Console.WriteLine("woot"); } }"

Вы можете легко изменить метод Main так, чтобы он принимал файл вместо встроенного кода, поэтому ваше консольное приложение будет вести себя аналогично интерпретатору python или ruby. Просто передайте имя файла вашему приложению и прочитайте его с помощью StreamReader в основной функции и передайте содержимое методу CompileCode. Что-то вроде этого:

static void Main(string[] args)
{
  if(args.Length == 1 && File.Exists(args[0]))
  {
    var assambly = CompileCode(File.ReadAllText(args[0]));
    ...
  }  
}

И в командной строке:

YourPath:\> YourApp.exe c:\script.cs

Вы должны реализовать интерфейс IRunner, вы также можете просто вызвать жестко запрограммированный метод Start без наследования интерфейса, который должен был просто показать концепцию компиляции класса на лету и его выполнения.

Надеюсь, это поможет.

CS-Script: движок скриптов C#

http://www.csscript.net/

Последний и лучший способ запустить C# в качестве сценария - использовать Roslyn. Какой компилятор C# написан на C#.

Гленн Блок, Джастин Русбэтч и Филип Войцишин собрали Рослин в программу под названием scriptcs, это именно то, что вы хотите.

Вы можете найти проект здесь. http://scriptcs.net/

Вы можете запустить файл сценария C# с именем server.csx позвонив

scriptcs server.csx
Другие вопросы по тегам