繁体   English   中英

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

[英](C#) Compiling class at runtime and calling methods from original code


我正在尝试在C#中运行时编译代码,然后从编译的代码中调用一个函数或初始化一个在原始代码中定义的类。
我目前的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.CSharp;
using System.CodeDom.Compiler;
using System.Reflection;

namespace CTFGame
{
    class Program
    {
        static void Main(string[] args)
        {
            string code = @"

using System;

namespace CTFGame
{
    public class MyPlayer
    {
        public static void Main ()
        {
            Console.WriteLine(""Hello world"");
        }
        /*public void DoTurn ()
        {
            Program.SayHello();
        }*/
    }
}

";
            CSharpCodeProvider provider = new CSharpCodeProvider();
            CompilerParameters parameters = new CompilerParameters();
            parameters.GenerateInMemory = true;

            CompilerResults results = provider.CompileAssemblyFromSource(parameters, code);
            if (results.Errors.HasErrors)
            {
                string errors = "";
                foreach (CompilerError error in results.Errors)
                {
                    errors += string.Format("Error #{0}: {1}\n", error.ErrorNumber, error.ErrorText);
                }
                Console.Write(errors);
            }
            else
            {
                Assembly assembly = results.CompiledAssembly;
                Type program = assembly.GetType("CTFGame.MyPlayer");
                MethodInfo main = program.GetMethod("Main");
                main.Invoke(null, null);
            }
        }

        public static void SayHello()
        {
            Console.WriteLine("I'm awesome ><");
        }
    }
}

现在,运行运行时加载的方法'Main'是成功的,并打印消息“Hello world”。 问题从这里开始:在原始代码中我有一个名为“SayHello”的方法。 我想从运行时加载的代码中调用此方法。
如果我取消注释“DoTurn”方法,编译器错误将在运行时显示:

Error #CS0103: The name 'Program' does not exist in the current context



我的问题是 - 这是可能的,怎么样?

将运行时加载的代码放在同一名称空间中没有帮助(这是有道理的),那么正确的方法是什么?

谢谢。

添加对当前程序集的引用解决了以下问题:

CSharpCodeProvider provider = new CSharpCodeProvider();
CompilerParameters parameters = new CompilerParameters();
parameters.GenerateInMemory = true;                
//The next line is the addition to the original code
parameters.ReferencedAssemblies.Add(Assembly.GetEntryAssembly().Location);

更多关于: 在运行时使用用户定义的函数编译c#

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM