更改事件后在文本框上执行或编译运行时 C# 代码 - "PlatformNotSupportedException"

Execute or compile runtime c# code on textbox after changes event - "PlatformNotSupportedException"

我想在我的应用程序中为用户提供一个选项,以便能够使用 Blazor 在 ASP.NET CORE 中自定义按钮。

我的意思是,C#代码可以存储在数据库中,compiled/executed在运行时。

如何"provide" razor 中的对象在此"code stored in the database" 中进行操作,然后在执行代码后在运行时进行这些更改?

请分享您的想法。

我已经尝试了一些方法,例如:

using Blazored.Toast.Services; 
using Microsoft.AspNetCore.Components; 
using Microsoft.CSharp;using Newtonsoft.Json; 
using System; 
using System.CodeDom.Compiler; 
using System.Collections.Generic; 
using System.Linq; 
using System.Reflection;
using System.Threading.Tasks;  

namespace Projeto.Web.Pages.Components {

public class McwEditModel : CustomComponentBase
{
    [Inject]
    public IToastService ToastService { get; set; }

    #region Parameters
    [Parameter]
    public string nome { get; set; }
    #endregion

    public void OnTextChanged(string newValue)
    {


        string source =
          @"public class SomeClass {
                public int OnTextChanged (string newValue) {
                    if (!string.IsNullOrEmpty(newValue))    {
                         ToastService.ShowWarning(newValue);
                }
                }
            } ";


       var compParms = new CompilerParameters
        {
            GenerateExecutable = false,
            GenerateInMemory = true
        };
        var csProvider = new CSharpCodeProvider();
        CompilerResults compilerResults =
            csProvider.CompileAssemblyFromSource(compParms, source);
        object typeInstance =
            compilerResults.CompiledAssembly.CreateInstance("SomeClass");
        MethodInfo mi = typeInstance.GetType().GetMethod("OnTextChanged");
        int methodOutput =
            (int)mi.Invoke(typeInstance, new object[] { newValue });

        InvokeAsync(StateHasChanged);
    }
}}

问题是这不起作用,特别是我在

行收到错误 "System.PlatformNotSupportedException: 'Operation is not supported on this platform.'"
" CompilerResults compilerResults =              csProvider.CompileAssemblyFromSource(compParms, source); "

我正在使用 Blazor .NET Core。

有什么机会或方法可以实现我想要的吗?

我使用 Microsoft.CodeAnalysis 包解决了它。

我需要创建一个

public class Globals

    {
        [Inject]
        public IToastService ToastService { get; set; }

        public string newValue { get; set; }

        public dynamic objeto { get; set; }
    }

在我的方法中我做了:

public void OnTextChanged(string newValue){

        Aql aql = new Aql { EaqcCodigo = "1", EaqcDescricao = "AQL" };

        var globals = new Globals { ToastService =  ToastService, newValue = newValue, objeto= aql };


        CSharpScript.RunAsync("ToastService.ShowWarning(newValue + \"- desc:\" + objeto.EaqcDescricao + \"- cod:\" + objeto.EaqcCodigo);", ScriptOptions.Default.WithReferences("Microsoft.CSharp"), globals).Wait();
    }

有了这个,现在我可以传递一个动态对象,还可以在数据库的字符串字段中编写任何代码,并在我想要的任何地方检索它,以自定义很多东西,即:更改字段(在自定义通用中和动态组件)