将外部程序集 (RCL) 加载到 Blazor WebAssembly 应用

Load external Assembly (RCL) to Blazor WebAssembly app

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

我发现这个 加载标准 类

我想要开发一个 pluggable/extensible 可视化框架,将 dll 放在 ASP.NET 核心服务器文件夹中,足以访问该 blazor 组件

解决方案配置:

步骤:

抱歉回答晚了,但是是的,你可以做到。

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

  1. 使用 Assembly.LoadfFrom(assemblyFilename)
  2. 加载程序集
  3. 在 .razor 文件中,使用 blazor 渲染树生成器动态渲染您的组件,如下所示:
RenderFragment EditContent = (__builder) =>
{
    __builder.OpenComponent(0, TypeOfYourComponent);
    __builder.AddAttribute(1, "attr1", attrValue);
    ...
    __builder.AddAttribute(n, "attrn", attrNValue);
    __builder.CloseComponent();
};
@EditContent
  1. 实施一个方法,return从当前加载的程序集中获取您想要的类型。以下将为您提供动态加载程序集导出的所有类型的列表:
var exportedTypes = new List<Type>();
var assemblies = AppDomain.CurrentDomain.GetAssemblies().ToList();

foreach (var assembly in assemblies)
{
    exportedTypes.AddRange(assembly.GetExportedTypes().ToList());
}

在我的例子中,我创建了一个单例,它在初始化时从文件夹加载程序集,并在这个单例中创建了一个方法来return步骤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(...));
...

我终于制定了一个解决方案,想与大家分享。模块管理器 允许您动态加载任何外部组件

在这里查看:

https://github.com/elgransan/BlazorPluginComponents

一些示例代码

        var componentPackage = "RazorClassLibrary2";
        var component = "Component2";
        var stream = await Http.GetStreamAsync($"{MyNavigationManager.BaseUri}/{componentPackage}/{componentPackage}.dll");
        var assembly = AssemblyLoadContext.Default.LoadFromStream(stream);
        componentType = assembly.GetType(componentPackage + "." + component);
        await DOMinterop.IncludeLink(componentPackage, $"/{componentPackage}/{componentPackage}.styles.css");

文件在服务器中的位置