Member 10318092 Ответов: 3

Как создать класс во время выполнения в .NET с помощью C#?


как мы можем создать класс динамически в c#? Я пробовал использовать приведенный ниже код, но не могу найти, где он сохраняется

Что я уже пробовал:

static void Main()
    {
        TestExpression("2+1-(3*2)+8/2");
        TestExpression("1*2*3*4*5*6");
        TestExpression("Invalid expression");
    }
    static void TestExpression(string expression)
    {
        try
        {
            int result = EvaluateExpression(expression);
            Console.WriteLine("'" + expression + "' = " + result);
        }
        catch (Exception)
        {
            Console.WriteLine("Expression is invalid: '" + expression + "'");
        }
    }
    public static int EvaluateExpression(string expression)
    {
        string code = string.Format("public static class Func{{ public static int func(){{ return {0};}}}}", expression);
        CompilerResults compilerResults = CompileScript(code);
        if (compilerResults.Errors.HasErrors)
        {
            throw new InvalidOperationException("Expression has a syntax error.");
        }
        Assembly assembly = compilerResults.CompiledAssembly;
        MethodInfo method = assembly.GetType("Func").GetMethod("func");
        return (int)method.Invoke(null, null);
    }

    public static CompilerResults CompileScript(string source)
    {

        CompilerParameters parms = new CompilerParameters();
        parms.GenerateExecutable = false;
        parms.GenerateInMemory = true;
        parms.IncludeDebugInformation = false;
        CodeDomProvider compiler = CSharpCodeProvider.CreateProvider("CSharp");
        return compiler.CompileAssemblyFromSource(parms, source);
    }

3 Ответов

Рейтинг:
1

Dave Kreskowiak

Этот код нигде не сохраняет файл .cs. Он создает текст для кода в памяти, компилирует его в памяти и возвращает результирующую сборку. Это нигде ничего не спасает. Как только сборка возвращается, исходный код выходит за пределы области действия и уничтожается.

Так в чем же проблема? Несмотря на свою эффективность, это довольно неэффективный способ оценки выражений. Есть и другие более быстрые и гибкие способы оценки выражений, если вы пытаетесь это сделать.


Member 10318092

спасибо за ваше предложение.

Рейтинг:
0

F-ES Sitecore

Он нигде не сохраняется, класс создается в памяти, поэтому, когда ваш процесс заканчивается, класс тоже уничтожается.


Member 10318092

Спасибо!

Рейтинг:
0

OriginalGriff

Как уже говорили другие, есть гораздо лучшие способы сделать это. Смотрите здесь например: Крошечный Вычислитель Выражений[^]


Member 10318092

Спасибо! Я буду смотреть на крошечный оценщик выражений.