更改事件后在文本框上执行或编译运行时 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();
}
有了这个,现在我可以传递一个动态对象,还可以在数据库的字符串字段中编写任何代码,并在我想要的任何地方检索它,以自定义很多东西,即:更改字段(在自定义通用中和动态组件)
我想在我的应用程序中为用户提供一个选项,以便能够使用 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();
}
有了这个,现在我可以传递一个动态对象,还可以在数据库的字符串字段中编写任何代码,并在我想要的任何地方检索它,以自定义很多东西,即:更改字段(在自定义通用中和动态组件)