控制LED真是一件很麻烦的事情,因为底层协议一个个字节进行了定义;一个字节定义错误,就会得到错误结果;
更麻烦的是,流明电子公司定义的底层协议啊,一会高位在前,一会低位在前,真不明白到底是怎么想的;
所以,才有这样一个想法,在一个文本框中写代码,来动态执行;
看到这篇帖子,http://www.cnblogs.com/zlgcool/archive/2008/10/12/1309616.html
拷贝,粘贴,就出来如下的代码了。。
唯一多了两行,引用了自身的程序集和添加了using;
因为我必须能够调用程序中包含的根据dll转换而来的C# API函数;
void Execute(String code)
{
try
{
var srcText = BuildCode(code, this.withResult.Checked);
// 1.Create a new CSharpCodePrivoder instance
CSharpCodeProvider objCSharpCodePrivoder = new CSharpCodeProvider();
// 2.Sets the runtime compiling parameters by crating a new CompilerParameters instance
CompilerParameters objCompilerParameters = new CompilerParameters();
objCompilerParameters.ReferencedAssemblies.Add("System.dll");
objCompilerParameters.ReferencedAssemblies.Add("System.Windows.Forms.dll");
objCompilerParameters.ReferencedAssemblies.Add("DynamicCSharpWin.exe");
objCompilerParameters.GenerateInMemory = true;
// 3.CompilerResults: Complile the code snippet by calling a method from the provider
CompilerResults cr = objCSharpCodePrivoder.CompileAssemblyFromSource(objCompilerParameters, srcText);
if (cr.Errors.HasErrors)
{
string strErrorMsg = cr.Errors.Count.ToString() + " Errors:";
for (int x = 0; x < cr.Errors.Count; x++)
{
strErrorMsg = strErrorMsg + "\r\nLine: " +
cr.Errors[x].Line.ToString() + " - " +
cr.Errors[x].ErrorText;
}
log(strErrorMsg);
MessageBox.Show("There were build erros, please modify your code.", "Compiling Error");
return;
}
// 4. Invoke the method by using Reflection
Assembly objAssembly = cr.CompiledAssembly;
var compileType = objAssembly.GetType("C");
if (compileType == null)
{
log("Error: " + "Couldn't load class.");
return;
}
object[] objCodeParms = new object[1];
MethodInfo methodInfo = compileType.GetMethod("T");
object result = methodInfo.Invoke(null, null);
if (withResult.Checked)
{
log(result.ToString());
}
}
catch (Exception ee)
{
log(ee.Message);
log(ee.StackTrace);
}
}
String BuildCode(String code, bool withResult)
{
StringBuilder builder = new StringBuilder();
builder.Append("using System;");
builder.Append("using DynamicCSharpWin;");
builder.Append("public class C{ ");
if (withResult) { builder.Append("public static object T(){"); }
else { builder.Append("public static void T(){"); }
builder.Append(code);
builder.Append("}}");
return builder.ToString();
}