我在一个研究小组工作,我的任务是为数据采集程序添加脚本功能。理想情况下,我希望能够在数据采集软件运行时编写脚本(并在运行时将这些脚本保存为文件)。命令行也可能不错。
我对C#一点都不熟悉,但我确实在其他语言(Objective-C,Python)方面有相当多的编码经验。我看到了这个链接https://blogs.msdn.microsoft.com/cdndevs/2015/12/01/adding-c-scripting-to-your-development-arsenal-part-1/,其中详细介绍了“Roselyn脚本编写软件包”,但我不确定这是否是我最好的选择。
有人能建议获得完整脚本功能的最简单方法吗? (我试图避免在这里失去几个月的生命= p)。非常感谢开始/建议的链接。
谢谢!
答案 0 :(得分:0)
你为我发布了一个有趣的链接,因为我几周前刚刚制作了类似的东西,但还没有实现。我的目标是创建一个C#"立即"控制台在网页上。
有一些关于以编程方式加载某些程序集的小问题,并且必须明确地引用它们。
这是后面的代码,请稍后发布您的解决方案,我很想知道。
这可以在运行时编写c#代码并获得String返回。
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;
}
答案 1 :(得分:0)
如果您愿意使用IronPython,可以直接在C#中执行脚本:
using IronPython.Hosting;
using Microsoft.Scripting.Hosting;
private static void doPython()
{
ScriptEngine engine = Python.CreateEngine();
engine.ExecuteFile(@"test.py");
}