2016-11-06 4 views
0

У меня есть простой интерфейс IScript. И я хочу, чтобы все сценарии выполняли его.Сценарии Roslyn с принудительным интерфейсом скрипта

public interface IScript<T> 
{ 
    T Execute(object[] args); 
} 

Я хочу использовать Roslyn scripting API для того чтобы достигнуть этого. Что-то вроде этого возможно с CSScript (см. Interface Alignment).

var code = @" 
    using System; 
    using My.Namespace.With.IScript;     

    public class Script : IScript<string> 
    { 
     public string Execute() 
     { 
      return ""Hello from script!""; 
     } 
    } 
"; 

var script = CSharpScript.Create(code, ScriptOptions.Default); // + Load all assemblies and references 
script.WithInterface(typeof(IScript<string>));     // I need something like this, to enforce interface 
script.Compile(); 

string result = script.Execute();        // and then execute script 

Console.WriteLine(result);          // print "Hello from script!" 

ответ

1

Тип безопасности - это статическая вещь, обеспечивающая время компиляции (вашего приложения). Создание и запуск CSharpScript выполняется во время выполнения. Таким образом, вы не можете обеспечить безопасность типов во время выполнения.

Возможно, CSharpScript - это не тот путь. Используя этот SO ответ, You can compile a piece of C# code into memory and generate assembly bytes with Roslyn.

Вы измените бы линию

object obj = Activator.CreateInstance(type); 

в

IScript<string> obj = Activator.CreateInstance(type) as IScript<string>; 
if (obj != null) { 
    obj.Execute(args); 
} 
+0

Спасибо за информацию –