2016-11-11 4 views
1

Я работаю в исследовательской группе, и мне поручено добавить функциональность сценариев в программу сбора данных. В идеале, я хочу иметь возможность писать сценарии во время работы программного обеспечения для сбора данных (и сохранять эти сценарии в виде файлов в пути). Командная строка также может быть приятной.Добавление функциональности сценариев в существующий проект C#

Я не очень опытен вообще с C#, но у меня довольно много опыта кодирования на другом языке (Objective-C, Python). Я видел эту ссылку https://blogs.msdn.microsoft.com/cdndevs/2015/12/01/adding-c-scripting-to-your-development-arsenal-part-1/, в которой подробно описывается пакет «Roselyn Scripting Package», но я не уверен, что это мой лучший вариант.

Можно ли предложить самый простой способ получить полную функциональность скриптов? (Я стараюсь не потерять месяцы своей жизни здесь = p). Ссылки, чтобы начать/советы, очень ценится.

Спасибо!

ответ

0

Вы отправили мне интересную ссылку, потому что я как-то прототипировал что-то подобное несколько недель назад, но еще не реализовал. Моя цель - создать консоль C# «немедленного» на веб-странице.

Есть некоторые незначительные проблемы, связанные с загрузкой некоторых сборок программным образом и их явным образом ссылаться на них.

Вот код позади, пожалуйста, позже опубликуйте свое решение, мне было бы интересно узнать.

Это позволяет написать код C# во время выполнения, а также получить возврат строки.

protected void getImmediateResult_Click(object sender, EventArgs e) 
    { 

     //building the code 
     string source = @"using System; 
     class MyType{ 
     public static String Evaluate(){ 
     <!expression!> 
     }}"; 

     string expression = this.txtimmediate.Text; 
     string finalSource = source.Replace("<!expression!>", expression); 
     textcodeCheck.Text = finalSource; 
     var compileUnit = new CodeSnippetCompileUnit(finalSource); 

     //preparing compilation 
     CodeDomProvider provider = new Microsoft.CSharp.CSharpCodeProvider(); 

     // Create the optional compiler parameters 

     //this correctly references the application but no System.Web etc 
     string[] refArray = new string[2]; 

     UriBuilder uri = new UriBuilder(Assembly.GetExecutingAssembly().CodeBase); 
     refArray[0] = uri.Path; 

     //this works 
     refArray[1] = "System.Web" + ".dll"; 

     ////NOT WORKING for non microsoft assemblies 
     //var allRefs = Assembly.GetExecutingAssembly().GetReferencedAssemblies(); 
     //string[] refArray = new string[allRefs.Length + 1]; 
     //int i = 1; 
     //foreach (AssemblyName refer in allRefs) 
     //{ 
     // refArray[i] = refer.Name + ".dll"; 
     // i++; 
     //} 

     var compilerParameters = new CompilerParameters(refArray); 

     CompilerResults compilerResults = provider.CompileAssemblyFromDom(compilerParameters, compileUnit); 
     if (compilerResults.Errors.Count > 0) 
     { 
      //1st error 
      this.txtResult.Text = compilerResults.Errors[0].ErrorText; 
      return; 
     } 

     //running it 
     Type type = compilerResults.CompiledAssembly.GetType("MyType"); 
     MethodInfo method = type.GetMethod("Evaluate"); 
     String result = (String)method.Invoke(null, null); 


     this.txtResult.Text = result; 
    } 
+0

Если вы используете 'CodeDom' (' CodeSnippetCompileUnit', 'CSharpCodeProvider 'и т. д.), вам не нужен этот хакерский источник строк, вы можете создать шаблон с помощью кода. – Kroltan

+0

@ Kroltan Вы уверены? Я просто не хочу каждый раз вводить синтаксис классов. – user6788933

+1

Я имею в виду, что шаблон может быть сконструирован в коде, а не разбираться со строкой и заменяться. Таким образом, вы получите более достоверные сообщения об отпечатках, а не об окружающем шаблоне. Пример (используя C# 6, но легко переводимый в другие версии): http://pastebin.com/5w86FrVb – Kroltan

0

Если вы готовы использовать IronPython, вы можете запускать скрипты непосредственно в C#:

using IronPython.Hosting; 
using Microsoft.Scripting.Hosting; 

private static void doPython() 
{ 
    ScriptEngine engine = Python.CreateEngine(); 
    engine.ExecuteFile(@"test.py"); 
} 

Get IronPython here.