最近我尝试编译并运行存储在其他地方的C#代码。我的目标是导入一个.txt文件,编译并运行它。我在 Simeon 的博客上关注了这篇文章,内容涉及在程序中编译和运行 C# 代码,一切运行良好。
然后,我尝试通过从计算机导入 C# 代码来使一些更复杂的东西,因此我创建了一个包含以下行的 .txt 文件,该文件存储在例如"C:\program.txt"中:(文本文件(
using System;
namespace Test
{
public class DynaCore
{
static public int Main(string str)
{
Console.WriteLine("Cool it work !");
return str.Length;
}
}
}
我根据同一篇文章做了一些编码,这就是我的代码:(C# 程序(
using System;
using System.Collections.Generic;
using System.Text;
using System.CodeDom.Compiler;
using System.IO;
using Microsoft.CSharp;
using System.Reflection;
namespace DynaCode
{
class Program
{
static void Main(string[] args)
{
string[] lines = System.IO.File.ReadAllLines(@"C:program.txt");
string bigLine = string.Empty;
foreach(string s in lines)
{
bigLine += s;
}
string[] finalLine = new string[1] { bigLine };
CompileAndRun(finalLine);
Console.ReadKey();
}
static void CompileAndRun(string[] code)
{
CompilerParameters CompilerParams = new CompilerParameters();
string outputDirectory = Directory.GetCurrentDirectory();
CompilerParams.GenerateInMemory = true;
CompilerParams.TreatWarningsAsErrors = false;
CompilerParams.GenerateExecutable = false;
CompilerParams.CompilerOptions = "/optimize";
string[] references = { "System.dll" };
CompilerParams.ReferencedAssemblies.AddRange(references);
CSharpCodeProvider provider = new CSharpCodeProvider();
CompilerResults compile = provider.CompileAssemblyFromSource(CompilerParams, code);
if (compile.Errors.HasErrors)
{
string text = "Compile error: ";
foreach (CompilerError ce in compile.Errors)
{
text += "rn" + ce.ToString();
}
throw new Exception(text);
}
Module module = compile.CompiledAssembly.GetModules()[0];
Type mt = null;
MethodInfo methInfo = null;
if (module != null)
{
mt = module.GetType("Test.DynaCore");
}
if (mt != null)
{
methInfo = mt.GetMethod("Main");
}
if (methInfo != null)
{
Console.WriteLine(methInfo.Invoke(null, new object[] { "here in dyna code. Yes it work !!" }));
}
}
}
}
这工作得很好,我按预期得到了以下输出:
Cool it work !
33
请注意,我将.txt文件的所有代码放在我执行myseft的大行中,因为正如Simeon所说:
CompileAssemblyFromSource使用的是一个字符串,用于每个C#代码块(文件(,而不是每一行。
即使现在这句话对我来说仍然有点晦涩难懂。
(我之前试过CompileAndRun(new string[1] { lines.ToString() });
但是编译.txt文件时出错,这就是我自己做大行的原因。
这是我的问题:我问自己:"如果我在.txt文件中添加注释怎么办?",所以我编辑它以及它的外观:(文本文件(
using System;
namespace Test
{
//This is a super simple test
public class DynaCore
{
static public int Main(string str)
{
Console.WriteLine("Cool it work !");
return str.Length;
}
}
}
当然,我得到了一个错误(CS1513(,因为我将.txt文件转换为一个大字符串,因此//
之后的所有内容都被忽略了。那么如何在我的.txt文件中使用//
注释并让程序工作呢?
我也尝试CompileAndRun(lines);
,但是启动程序后,由于异常,它在编译.txt文件时崩溃。
我对此进行了一些搜索,但没有找到有关评论的任何内容。我想在 CompileAndRun 方法中只传递一行大行有问题,但传递几行不起作用,因为我说上面。(另注:使用/* insert comment */
作品进行评论。
提供给CompileAssemblyFromSource
的每个元素都应该是一个文件,而不是一行代码。因此,将整个文件读取为单个字符串并将其提供给该方法,它将正常工作。
static void Main(string[] args)
{
var code = System.IO.File.ReadAllText(@"C:program.txt");
CompileAndRun(code);
Console.ReadKey();
}
static void CompileAndRun(string code)
{
CompilerParameters CompilerParams = new CompilerParameters();
string outputDirectory = Directory.GetCurrentDirectory();
CompilerParams.GenerateInMemory = true;
CompilerParams.TreatWarningsAsErrors = false;
CompilerParams.GenerateExecutable = false;
CompilerParams.CompilerOptions = "/optimize";
string[] references = { "System.dll" };
CompilerParams.ReferencedAssemblies.AddRange(references);
CSharpCodeProvider provider = new CSharpCodeProvider();
CompilerResults compile = provider.CompileAssemblyFromSource(CompilerParams, code);
// ...
}