【问题标题】:Load external Assembly (RCL) to Blazor WebAssembly app将外部程序集 (RCL) 加载到 Blazor WebAssembly 应用程序
【发布时间】:2020-12-03 16:44:27
【问题描述】:

是否可以将 RCL(Razor 组件库)动态加载到 Blazor WebAssembly?

我发现这个Loading an external .NET Standard 2.0 assembly with blazor 来加载一个标准类

我想要的是开发一个可插入/可扩展的可视化框架,将一个 dll 放在一个 ASP.NET Core Server 文件夹中,以便访问该 blazor 组件

解决方案配置:

  • ASP.NET Core WebAPI 项目
  • Blazor WebAssembly 项目
  • 带有一些组件的 RCL 项目 1
  • 带有其他组件的 RCL 项目 2

步骤:

  • 打开 Blazor 页面并 OnInitializedAsync() 以二进制形式从 WebAPI 检索一些 dll
  • 将二进制文件加载到程序集中
  • 引用程序集并在页面中动态使用它

【问题讨论】:

    标签: .net-assembly blazor-webassembly dynamic-import


    【解决方案1】:

    很抱歉回答晚了,但是是的,你可以这样做。

    要使用动态组件,请按以下步骤操作:

    1. 使用Assembly.LoadfFrom(assemblyFilename) 加载程序集
    2. 在 .razor 文件中,使用 blazor 渲染树构建器动态渲染组件,如下所示:
    RenderFragment EditContent = (__builder) =>
    {
        __builder.OpenComponent(0, TypeOfYourComponent);
        __builder.AddAttribute(1, "attr1", attrValue);
        ...
        __builder.AddAttribute(n, "attrn", attrNValue);
        __builder.CloseComponent();
    };
    @EditContent
    
    1. 实现从当前加载的程序集中返回所需类型的方法。下面将为您提供一个列表,其中包含由动态加载的程序集导出的所有类型:
    var exportedTypes = new List<Type>();
    var assemblies = AppDomain.CurrentDomain.GetAssemblies().ToList();
    
    foreach (var assembly in assemblies)
    {
        exportedTypes.AddRange(assembly.GetExportedTypes().ToList());
    }
    

    在我的例子中,我创建了一个单例,它在初始化时从文件夹加载程序集,并在此单例中创建了一个方法来返回步骤 3 中定义的列表中的类型。因此,通过这种方式,您可以通过在 Startup.cs 上注册并将其注入您的剃须刀组件,随时调用此服务:

    public class CustomComponentService : ICustomComponentService
    {
        public CustomComponentService(...)
        {
            // load the assemblies here
        }
    
        public Type GetCustomComponent(...)
        {
            //search in the loaded assemblies by any criteria you like
        }
    }
    

    在 Startup.cs 的 ConfigureServices 方法中:

    _ = services.AddSingleton<ICustomComponentService, CustomComponentService>();
    

    在剃刀文件中:

    @inject ICustomComponentService CustomComponentService
    
    ...
    __builder.OpenComponent(0, CustomComponentService.GetCustomComponent(...));
    ...
    

    【讨论】:

      猜你喜欢
      • 2020-12-31
      • 1970-01-01
      • 2021-07-21
      • 2019-06-13
      • 1970-01-01
      • 2013-11-30
      • 2020-12-25
      • 2021-10-26
      • 2021-06-28
      相关资源
      最近更新 更多