0

我正在使用 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 是一个很棒的网站,我已经找到了去哪里的路线图,直到今天早上我还没有任何线索,但现在我可以继续了,再次感谢大家如果我被困在某个地方会再次提问

4

5 回答 5

2

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

然后,您可以使用CSharpCodeProvider执行代码,就像在这篇文章中一样:

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[] { });
}
于 2012-07-20T09:32:00.410 回答
0

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

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

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

于 2012-07-20T09:27:06.660 回答
0

目前尚不清楚您要编译哪种代码,但这里有一个关于如何使用 C# 编译代码代码的指南。

于 2012-07-20T09:27:42.630 回答
0

您可以选择 CodeDOM 或 IL Emit

关于 CodeDOM 的更多帮助

有关 IL 生成器/发射器的更多信息

于 2012-07-20T09:31:45.387 回答
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()
于 2012-07-20T09:50:35.700 回答