使用CSharpCodeProvider进行C#运行时编译

丹·布伦纳

使用本教程,我获得了成功:http : //www.codeproject.com/Tips/715891/Compiling-Csharp-Code-at-Runtime设置了用于运行时编译和C#代码执行的框架。以下是我目前拥有的代码:

public static class CodeCompiler {

public static object InterpretString(string executable) {
    string compilation_string = 
    @"
    static class RuntimeCompilationCode { 
        public static void Main() {}  
        public static object Custom() {
            /* CODE HERE */
        }
    }";

    compilation_string = compilation_string.Replace("/* CODE HERE */", executable);

    CSharpCodeProvider provider = new CSharpCodeProvider();
    CompilerParameters compiler_parameters = new CompilerParameters();

    // True - memory generation, false - external file generation
    compiler_parameters.GenerateInMemory = true;

    // True - exe file generation, false - dll file generation
    compiler_parameters.GenerateExecutable = true;

    // Compile
    CompilerResults results = provider.CompileAssemblyFromSource(compiler_parameters, compilation_string);

    // Check errors
    if (results.Errors.HasErrors) {
        StringBuilder builder = new StringBuilder();
        foreach (CompilerError error in results.Errors) {
            builder.AppendLine(String.Format("Error ({0}): {1}", error.ErrorNumber, error.ErrorText));
        }
        throw new InvalidOperationException(builder.ToString());
    }

    // Execute
    Assembly assembly = results.CompiledAssembly;
    Type program = assembly.GetType("RuntimeCompilationCode");
    MethodInfo execute = program.GetMethod("Custom");
    return execute.Invoke(null, null);
}

}

我可以将字符串(例如"return 2;"形式的语句传递InterpretString()它,它将作为Custom()函数的一部分进行编译和执行但是,我想知道是否可以使用相同的方法来执行原始文件中的方法。例如,假设CodeCompiler该类有另一个returnsTwo()返回整数2的方法。是否有办法通过传递"CodeCompiler.returnsTwo();"或类似的字符串来调用这种方法InterpretString()

詹斯·梅尼克

只要该函数是静态函数,这就不成问题,只要您向编译添加适当的引用即可。我在几个项目上都做不到这件事。

如果CodeCompiler在当前的可执行文件中,则必须以这种方式包括引用:

string exePath = Assembly.GetExecutingAssembly().Location;
string exeDir = Path.GetDirectoryName(exePath);

AssemblyName[] assemRefs = Assembly.GetExecutingAssembly().GetReferencedAssemblies();
List<string> references = new List<string>();

foreach (AssemblyName assemblyName in assemRefs)
    references.Add(assemblyName.Name + ".dll");

for (int i = 0; i < references.Count; i++)
{
    string localName = Path.Combine(exeDir, references[i]);

    if (File.Exists(localName))
        references[i] = localName;
}

references.Add(exePath);

CompilerParameters compiler_parameters = new CompilerParameters(references.ToArray())

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Scala代码运行时无需使用scalac进行编译?

来自分类Dev

Scala代码运行时无需使用scalac进行编译?

来自分类Dev

C#中的运行时类型与编译时类型

来自分类Dev

C#中的运行时类型与编译时类型

来自分类Dev

如何在运行时编译的C#代码中使用“ UnityEngine”?

来自分类Dev

在 C++11 中,是否可以在编译时使用运行时甚至编译时限制条件进行 for 循环?

来自分类Dev

T4在C#中的运行时期间运行或编译tt文件

来自分类Dev

模板已使用比当前运行时版本更早的Handlebars进行了预编译

来自分类Dev

为什么此代码使用UndecidableInstances进行编译,然后生成运行时无限循环?

来自分类Dev

OCaml在运行时进行编译和加载

来自分类Dev

在运行时编译C#代码[更新:或替代方法]

来自分类Dev

(C#)在运行时编译类并从原始代码调用方法

来自分类Dev

C#运行时错误

来自分类Dev

在编译时在C ++元编程中使用运行时参数(变量)

来自分类Dev

使用g ++编译Objective-C项目时出现运行时错误

来自分类Dev

C#如何在运行时将模板类型的类型与内置类型进行比较

来自分类Dev

C ++ 11自动编译时间或运行时?

来自分类Dev

C ++ 11自动编译时间或运行时?

来自分类Dev

使用Dart在运行时/编译时生成类

来自分类Dev

使用Java在运行时读取已编译的信息

来自分类Dev

如何使用运行时类型的编译时接口?

来自分类Dev

使用Java在运行时编译jasperreport子报表

来自分类Dev

使用Dart在运行时/编译时生成类

来自分类Dev

从文本运行时编译类时使用 ValueTuple

来自分类Dev

是否在运行时对没有变量的C函数调用进行了预编译或评估?

来自分类Dev

行为SDK-ChangePropertyAction使用.net本机进行编译时会在运行时生成参数异常

来自分类Dev

在具有例程调用的并行区域中使用 PGI 而不是 Cray 进行编译时出现运行时错误

来自分类Dev

您可以使用旧的运行时库进行Visual c ++ 2013构建吗?

来自分类Dev

当引用Newtonsoft.Json.dll时,在单声道下在运行时编译C#代码失败

Related 相关文章

  1. 1

    Scala代码运行时无需使用scalac进行编译?

  2. 2

    Scala代码运行时无需使用scalac进行编译?

  3. 3

    C#中的运行时类型与编译时类型

  4. 4

    C#中的运行时类型与编译时类型

  5. 5

    如何在运行时编译的C#代码中使用“ UnityEngine”?

  6. 6

    在 C++11 中,是否可以在编译时使用运行时甚至编译时限制条件进行 for 循环?

  7. 7

    T4在C#中的运行时期间运行或编译tt文件

  8. 8

    模板已使用比当前运行时版本更早的Handlebars进行了预编译

  9. 9

    为什么此代码使用UndecidableInstances进行编译,然后生成运行时无限循环?

  10. 10

    OCaml在运行时进行编译和加载

  11. 11

    在运行时编译C#代码[更新:或替代方法]

  12. 12

    (C#)在运行时编译类并从原始代码调用方法

  13. 13

    C#运行时错误

  14. 14

    在编译时在C ++元编程中使用运行时参数(变量)

  15. 15

    使用g ++编译Objective-C项目时出现运行时错误

  16. 16

    C#如何在运行时将模板类型的类型与内置类型进行比较

  17. 17

    C ++ 11自动编译时间或运行时?

  18. 18

    C ++ 11自动编译时间或运行时?

  19. 19

    使用Dart在运行时/编译时生成类

  20. 20

    使用Java在运行时读取已编译的信息

  21. 21

    如何使用运行时类型的编译时接口?

  22. 22

    使用Java在运行时编译jasperreport子报表

  23. 23

    使用Dart在运行时/编译时生成类

  24. 24

    从文本运行时编译类时使用 ValueTuple

  25. 25

    是否在运行时对没有变量的C函数调用进行了预编译或评估?

  26. 26

    行为SDK-ChangePropertyAction使用.net本机进行编译时会在运行时生成参数异常

  27. 27

    在具有例程调用的并行区域中使用 PGI 而不是 Cray 进行编译时出现运行时错误

  28. 28

    您可以使用旧的运行时库进行Visual c ++ 2013构建吗?

  29. 29

    当引用Newtonsoft.Json.dll时,在单声道下在运行时编译C#代码失败

热门标签

归档