将外部程序集 (RCL) 加载到 Blazor WebAssembly 应用
Load external Assembly (RCL) to Blazor WebAssembly app
是否可以将 RCL(Razor 组件库)动态加载到 Blazor WebAssembly?
我发现这个 加载标准 类
我想要开发一个 pluggable/extensible 可视化框架,将 dll 放在 ASP.NET 核心服务器文件夹中,足以访问该 blazor 组件
解决方案配置:
- ASP.NET 核心 WebAPI 项目
- Blazor WebAssembly 项目
- RCL 项目 1 和一些组件
- RCL 项目 2 和其他组件
步骤:
- 打开 Blazor 页面,OnInitializedAsync() 从 WebAPI 中以二进制形式检索一些 dll
- 将二进制文件加载到程序集
- 引用程序集并在页面中动态使用它
抱歉回答晚了,但是是的,你可以做到。
要使用动态组件,请按照下列步骤操作:
- 使用
Assembly.LoadfFrom(assemblyFilename)
加载程序集
- 在 .razor 文件中,使用 blazor 渲染树生成器动态渲染您的组件,如下所示:
RenderFragment EditContent = (__builder) =>
{
__builder.OpenComponent(0, TypeOfYourComponent);
__builder.AddAttribute(1, "attr1", attrValue);
...
__builder.AddAttribute(n, "attrn", attrNValue);
__builder.CloseComponent();
};
@EditContent
- 实施一个方法,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");
文件在服务器中的位置
是否可以将 RCL(Razor 组件库)动态加载到 Blazor WebAssembly?
我发现这个
我想要开发一个 pluggable/extensible 可视化框架,将 dll 放在 ASP.NET 核心服务器文件夹中,足以访问该 blazor 组件
解决方案配置:
- ASP.NET 核心 WebAPI 项目
- Blazor WebAssembly 项目
- RCL 项目 1 和一些组件
- RCL 项目 2 和其他组件
步骤:
- 打开 Blazor 页面,OnInitializedAsync() 从 WebAPI 中以二进制形式检索一些 dll
- 将二进制文件加载到程序集
- 引用程序集并在页面中动态使用它
抱歉回答晚了,但是是的,你可以做到。
要使用动态组件,请按照下列步骤操作:
- 使用
Assembly.LoadfFrom(assemblyFilename)
加载程序集
- 在 .razor 文件中,使用 blazor 渲染树生成器动态渲染您的组件,如下所示:
RenderFragment EditContent = (__builder) =>
{
__builder.OpenComponent(0, TypeOfYourComponent);
__builder.AddAttribute(1, "attr1", attrValue);
...
__builder.AddAttribute(n, "attrn", attrNValue);
__builder.CloseComponent();
};
@EditContent
- 实施一个方法,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");
文件在服务器中的位置