我正在使用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是一个很棒的网站,我已经找到了路线图,直到今天早上我没有任何线索,但现在我可以继续,再次感谢你们所有人 如果我被困在某个地方会再次提出问题
答案 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()