Мне нужно создать эту функцию для моего веб-приложения, написанного на C# и работающего на .NET 10 с использованием Blazor.
Я могу скомпилировать сборку из текста в памяти и вызвать метод Main из скомпилированной сборки. Метод Main записывает данные в консоль моего веб-приложения.
Ассемблерный код:
Код: Выделить всё
using System;
public class MyAssemblyClass
{
public static void Main(string[] args)
{
Console.WriteLine("hello world");
}
}
Код: Выделить всё
SyntaxTree parsedSyntaxTree = Parse(textsource, "", CSharpParseOptions.Default.WithLanguageVersion(LanguageVersion.CSharp12));
CSharpCompilation? compilation = CSharpCompilation.Create(Frame.AssemblyClassName, [parsedSyntaxTree], DefaultReferences, exe_DefaultCompilationOptions);
EmitResult result = default!;
Exception? exception = default!;
using (var ms = new MemoryStream())
{
try
{
result = compilation.Emit(ms);
if (result.Success)
{
Type? FrameType = CompilleType(ms, Frame);
if (FrameType != null)
{
object obj = Activator.CreateInstance(FrameType);
FrameType.InvokeMember("Main",
BindingFlags.Default | BindingFlags.InvokeMethod,
null, obj, new object[]{});
}
else
throw new Exception("Invoke error.");
}
}
catch (Exception ex)
{
exception = ex;
}
}
UPD:
В моем приложении есть веб-страница для пользователя с таблицей динамических данных и простая операция CRUD с данными. Мне нужен механизм расширения для администраторов с такими функциями, как «BeforeLoadData», «AfterLoadData», «BeforeSaveData»... и т. д.
В этой функции администраторы приложений могут писать код расширения C# для манипулирования таблицей данных в контексте выполнения. Данным функционалом обладают многие приложения типа "САП, 1С"