我可以从文件中读取代码并让代码在应用程序中运行

时间:2012-07-20 09:18:54

标签: c# wpf

我正在使用C#在WPF中开发桌面应用程序。

为简单起见,假设我的应用程序具有在所述方向上绘制线条的功能goleft() , goright() , goforward() , goback() .

当调用这些函数中的任何一个时,将在屏幕上绘制一英寸的线。

我想创建应用程序,用户将在任何编辑器(例如记事本)中的文件中编写代码,并以某种固定格式保存该文件(例如.abc或.xyz)

虚构的例子:

   (section_start)

   For(int i = 0 ; i<= 20 ; i++ ) 
    {
      if(i<5)
      goforward();

      else if(i==5)   
       goleft();

      else if(i < 10)
       forward();
        .......
        ........
    }

    (section_End)

我可以创建应该能够读取此文件的应用程序并执行在(section_start)和(section_End)之间写入的代码。并且只有在可能的情况下才能检查语法错误...(不是强制性的)。

请指导我这个问题:

披露:由于我公司的规定,我的实际应用程序在某种程度上无法进行讨论。

感谢所有回答我问题的人。 Stackoverflow是一个很棒的网站,我已经找到了路线图,直到今天早上我没有任何线索,但现在我可以继续,再次感谢你们所有人 如果我被困在某个地方会再次提出问题

5 个答案:

答案 0 :(得分:1)

您可以使用FileInfo阅读文件内容,并获取您需要执行的代码。

然后,您可以使用此CSharpCodeProvider中的post执行代码:

using (Microsoft.CSharp.CSharpCodeProvider foo = 
       new Microsoft.CSharp.CSharpCodeProvider())
{
var res = foo.CompileAssemblyFromSource(
    new System.CodeDom.Compiler.CompilerParameters() 
    {  
        GenerateInMemory = true 
    }, 
    "public class FooClass { public string Execute() { return \"output!\";}}"
);

var type = res.CompiledAssembly.GetType("FooClass");

var obj = Activator.CreateInstance(type);

var output = type.GetMethod("Execute").Invoke(obj, new object[] { });
}

答案 1 :(得分:0)

如果我理解正确,这称为脚本应用程序。 C#不支持开箱即用。要研究的一件事可能是来自微软的新Roselyn编译器(它是C#编译器的一个新版本,可以让你做到这一点。)

有关Roselyn的更多信息,请查看: http://blogs.msdn.com/b/csharpfaq/archive/2011/12/02/introduction-to-the-roslyn-scripting-api.aspx

我只看过它的演示,但看起来很有意思,应该可以解决你的问题。

答案 2 :(得分:0)

目前尚不清楚您希望编译什么类型的代码,但这里有一个关于如何使用C#编译代码的guide

答案 3 :(得分:0)

答案 4 :(得分:0)

您可以使用IronPython来处理脚本。

以下是如何执行此操作的示例:

首先,您需要一个导航对象来执行以下操作:

public class NavigationObject
{
    public int Offset { get; private set; }

    public void GoForwards()
    {
        Offset++;
    }

    public void GoBackwards()
    {
        Offset--;
    }
}

然后执行文件的代码:

public void RunNavigationScript(string filePath, NavigationObject navObject)
{
    var engine = Python.CreateEngine();
    var scope = engine.CreateScope();

    scope.SetVariable("navigation", navObject);
    var source = engine.CreateScriptSourceFromFile(filePath);
    try
    {
        source.Execute(scope);
    }
    catch(Exception
    {
    }
}

然后,脚本文件可以采用以下形式:

for x in range(0,20):
    if x == 5:
        navigation.GoBackwards()
    else:
        navigation.GoForwards()
相关问题