Reputation: 1
I need to implement a feature in my MAUI and Blazor project where, upon opening the application, it checks a server for a new version of the frontend. If a new version is available, it should download the updated DLL from the shared project and load it dynamically.
I have three projects: MAUI, Shared, and Web. All the UI is in Shared, and the MAUI and Web projects implement interfaces from Shared. I check if there is a new DLL for Shared, and if so, I load it.
This is my actual implementation:
private void LoadDynamicAssembly()
{
try
{
var dllPath = Components.Layout.DownloadLayout.GetFrontendFilePath();
var assemblyLoadContext = new AssemblyLoadContext("DynamicAssemblyContext", isCollectible: true);
var assembly = assemblyLoadContext.LoadFromAssemblyPath(dllPath);
var componentType = assembly.GetType("MyProject.Shared.Components.Routes");
if (componentType == null)
{
throw new Exception("No se encontró el tipo MyProject.Shared.Components.Routes en el ensamblado.");
}
Logger.LogInformation("Componente encontrado. Actualizando la UI.");
// Limpiar y cargar el nuevo componente
ReinitializeBlazorWebView(componentType);
}
catch (Exception ex)
{
Logger.LogError(ex, "Error al cargar el ensamblado o el componente.");
DisplayAlert("Error", $"Failed to load the component: {ex.Message}", "OK");
}
}
It's throwing the error:
'Cannot provide a value for property 'FormFactor' on type 'MyProject.Shared.Components.Pages.DeviceFormFactor'. There is no registered service of type 'MyProject.Shared.Interfaces.IFormFactor''.
This is the DeviceFormFactor page (located in the Shared project):
@page "/device-form-factor"
@using MyProject.Shared.Interfaces
@inject IFormFactor FormFactor
<PageTitle>Form Factor</PageTitle>
<h1>Device Form Factor</h1>
<p>You are running on dll:</p>
<ul>
<li>Form Factor: @factor</li>
<li>Platform: @platform</li>
</ul>
<p>
<em>This component is defined in the MyProject.Shared library.</em>
</p>
@code {
private string factor => FormFactor.GetFormFactor();
private string platform => FormFactor.GetPlatform();
}
In the MAUI project is the service declared:
using MyProject.Shared;
using Microsoft.Extensions.Logging;
using MyProject.Maui.Services;
using MyProject.Shared.Interfaces;
namespace MyProject.Maui
{
public static class MauiProgram
{
public static MauiApp CreateMauiApp()
{
InteractiveRenderSettings.ConfigureBlazorHybridRenderModes();
var builder = MauiApp.CreateBuilder();
builder
.UseMauiApp<App>()
.ConfigureFonts(fonts =>
{
fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
});
builder.Services.AddMauiBlazorWebView();
#if DEBUG
builder.Services.AddBlazorWebViewDeveloperTools();
builder.Logging.AddDebug();
#endif
builder.Services.AddSingleton<IFormFactor, FormFactor>();
return builder.Build();
}
}
}
And the FormFactor implemented:
using MyProject.Shared.Interfaces;
namespace MyProject.Maui.Services;
public class FormFactor : IFormFactor
{
public string GetFormFactor()
{
return DeviceInfo.Idiom.ToString();
}
public string GetPlatform()
{
return DeviceInfo.Platform.ToString() + " - " + DeviceInfo.VersionString;
}
}
Upvotes: 0
Views: 106