Динамическая компиляция плагинов и доступ к родительскому приложению - C#

Узнай цену своей работы

Формулировка задачи:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
using System.IO;
using System.Reflection;
using Microsoft.CSharp;
using System.CodeDom.Compiler;
 
namespace LauncherCde
{
    class Eval
    {
        public static Dictionary<string, Assembly> ClassObjects = new Dictionary<string, Assembly>();
        public static void Init()
        {
            var this_namespace = typeof(Eval).Namespace;
            if (Directory.Exists("./Plugins/"))
            {
                var ListFiles = Directory.GetFiles("./Plugins/");
                In();
                foreach (var _File in ListFiles)
                {
                    FileInfo fi = new FileInfo(_File);
                    var ex = fi.Name.Split('.');
                    var filename = fi.Name.Remove(fi.Name.Length -3, 3);
                    if (ex[ex.Length - 1] == "cs")
                    {
                        var result = Run(File.ReadAllLines(_File));
                        if (result != null) {
                            Console.WriteLine("File <" + filename + "> compiling success!");
                            
                            ClassObjects.Add(filename, result);
                            CallHook("OnLoad", filename, result);
                        }
                    }
                    else Console.WriteLine("File <" + filename + "> not is CSharp file!");
                }
                CallHook("OnPluginsLoaded");
            }
        }
 
        public static void CallHook(string HookName, string ClassName, Assembly FileObject, bool Need = true)
        {
            object o = FileObject.CreateInstance(ClassName);
 
            Type t = o.GetType();
            MethodInfo mi = t.GetMethod(HookName);
            if (mi != null)
                mi.Invoke(o, null);
            else
                if(Need)
                    Console.WriteLine("Not fond method: <"+HookName+"> To plugin: " + ClassName);
        }
 
        public static void CallHook(string HookName)
        {
            foreach (var classobject in ClassObjects)
                CallHook(HookName, classobject.Key, classobject.Value, false);
        }

        public static CSharpCodeProvider c = new CSharpCodeProvider();
        public static ICodeCompiler icc = c.CreateCompiler();
        public static CompilerParameters cp = new CompilerParameters();
 
        public static void In()
        {
            cp.ReferencedAssemblies.Add("system.dll");
            cp.ReferencedAssemblies.Add("system.xml.dll");
            cp.ReferencedAssemblies.Add("system.data.dll");
            cp.ReferencedAssemblies.Add("system.drawing.dll");
 
            cp.CompilerOptions = "/t:library";
            cp.GenerateInMemory = true;
        }
 
        public static Assembly Run(string[] filecontent)
        {

            StringBuilder sb = new StringBuilder("");
            foreach (var line in filecontent)
                sb.Append(line);

            CompilerResults cr = icc.CompileAssemblyFromSource(cp, sb.ToString());
            if (cr.Errors.Count > 0)
            {
                Console.WriteLine("Error compiling: " + cr.Errors[0].ErrorText);
                return null;
            }
 
            return cr.CompiledAssembly;
        }
 
    }
}
Здрасти, вот склепал код. Набросок такой. И он работает! Он выполняет файлы и всё прекрасно. Но проблема в том что эти файл, а точнее код в них не видит не пространство имен не содержимое программы которая компилирует их. Ни друг друга они не видят. Как будто компилируются вообще обсалютно разные программы не соедененные не чем. Что можно сделать? Как компилировать и прикреплять к процессу скомпилированный вариант что бы на ходу всё это было м?

Решение задачи: «Динамическая компиляция плагинов и доступ к родительскому приложению»

textual
Листинг программы
CSScript.LoadCode(File.ReadAllText(_File))

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4.444 из 5
Похожие ответы