使用CodeDom进行编译

prizm1

我开始对CodeDom进行了一些试验,并制作了简单的Application,该Application从用户输入中收集源代码,并尝试使用C#语法进行编译。

对于那些想尝试整个过程的人,请键入end ...以完成源代码条目。

这是示例:

using System;
using System.Collections;
using System.Reflection;
using System.Collections.Generic;
using System.Diagnostics;
using Microsoft.CSharp;
using System.CodeDom.Compiler;

namespace CodeDomTest
{
    class Program
    {
        static void Main(string[] args)
        {
            getTestCode();
        }

        public static Assembly getTestCode()
        {
            CompilerParameters CompilerOptions = new CompilerParameters(
                assemblyNames: new String[] { "mscorlib.dll", "System.dll", "System.Core.dll" }, 
                outputName: "test.dll", 
                includeDebugInformation: false) 
            { TreatWarningsAsErrors = true, WarningLevel = 0, GenerateExecutable = false, GenerateInMemory = true };
            List<String> newList = new List<String>();
            String a = null;
            while(a != "end...")
            {
                a = Console.ReadLine();
                if (!a.Equals( "end..."))
                    newList.Add(a);
            }
            String[] source = { "class Test {static void test() {System.Console.WriteLine(\"test\");}}" };
            source = newList.ToArray();
            CSharpCodeProvider zb = new CSharpCodeProvider(new Dictionary<String, String> { { "CompilerVersion", "v4.0" } });
            CompilerResults Results = zb.CompileAssemblyFromSource(CompilerOptions, source);
            Console.WriteLine(Results.Errors.HasErrors);
            CompilerErrorCollection errs = Results.Errors;
            foreach(CompilerError z in errs) 
            {
                Console.WriteLine(z.ErrorText);
            }
            if (!(errs.Count > 0)) 
            {
                AssemblyName assemblyRef = Results.CompiledAssembly.GetName();
                AppDomain.CurrentDomain.Load(assemblyRef);
                //foreach (String a in )
                Console.WriteLine(Results.CompiledAssembly.FullName.ToString());
                Type tempType = Results.CompiledAssembly.GetType("Test");
                MethodInfo tempMethodInfo = tempType.GetMethod("test", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public);
                if (tempMethodInfo != null)
                    tempMethodInfo.Invoke(null,null);
            }
            Console.ReadLine();
            return null;
        }
    }
}

现在您可以看到,基本上它会编译以下代码:

class Test {static void test() {System.Console.WriteLine(\"test\");}}

如果您以这种方式(不带“)”作为用户输入将其输入到程序中,则效果很好。但是,只要您在一行结束后按回车键插入换行符,编译就会中断,并出现多个错误。通过给出以下语句将每一行作为自己的程序:

} expected
Expected class, delegate, enum, interface, or struct
A namespace cannot directly contain members such as fields or methods
A namespace cannot directly contain members such as fields or methods
Type or namespace definition, or end-of-file expected
Type or namespace definition, or end-of-file expected

对于以下输入:

class Test 
{
static void test() 
{
System.Console.WriteLine
("test");
}
}

然后,我是否必须将用户(自定义)条目细分为一行?

哈萨尼·H

在每一行应包含完整的源代码不是一个单一的代码行。由于您是将代码逐行收集到源数组中,因此必须将其折叠为单个字符串,然后将该字符串添加到数组中以传递给CompileAssemblyFromSourceTry this:

 while (a != "end...")
 {
     a = Console.ReadLine();
     if (!a.Equals("end..."))
         newList.Add(a);
 }

 string code = string.Join("\r\n", newList);
 string[] source = new string[] { code };

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用CodeDom进行编译

来自分类Dev

在Azure上使用Codedom / CSharpCodeProvider进行动态编译

来自分类Dev

使用CodeDom编译时处理错误

来自分类Dev

与CodeDom编译代码C#Wpf中的主窗口类进行通信

来自分类Dev

可以使用C#codeDOM回调预编译函数吗?

来自分类Dev

使用webpack进行更少的编译

来自分类Dev

如何使用libmosquitto进行编译

来自分类Dev

使用Makefile进行简单编译?

来自分类Dev

使用gcc与system()进行编译

来自分类Dev

使用constexpr进行错误编译

来自分类Dev

如何使用clang ++进行编译?

来自分类Dev

如何使用minilibx进行编译?

来自分类Dev

无法使用Picocli进行编译

来自分类Dev

无法使用openmp进行编译

来自分类Dev

如何使用clang ++进行编译?

来自分类Dev

使用 docker compose 进行编译

来自分类Dev

使用Edgetpu编译器进行Tensorflow编译时出错

来自分类Dev

如何使用交叉编译器进行编译?

来自分类Dev

使用gulp进行打字稿编译

来自分类Dev

std :: find()无法使用gcc进行编译

来自分类Dev

无法在OpenBSD上使用Editline进行编译

来自分类Dev

Kotlin:使用Gradle进行增量编译

来自分类Dev

使用编译时编织进行依赖注入?

来自分类Dev

使用-fPIC和-frecursive进行gfortran编译

来自分类Dev

Gradle无法使用lib进行编译

来自分类Dev

使用Mingw进行dogecoind.exe编译

来自分类Dev

SASS @ at-root不使用','进行编译

来自分类Dev

Gradle无法使用Java 1.8进行编译

来自分类Dev

使用Boost 1.56.0进行编译问题