想法是主程序尽量的简单,其他的尽量按需调用。

所以把Demo这个主程序的内容大部分移到LunZi.Common项目去了。

  1. Demo的MauiProgram
      public static MauiApp CreateMauiApp()
      {
    
          try
          {
              var assembly = AssemblyLoadContext.Default.LoadFromAssemblyPath(@"C:\Plugin\windows\LunZi.Common.dll");
    
              var type = assembly.GetType("LunZi.Common.MauiProgram");
              var method = type!.GetMethod("CreateMauiApp", BindingFlags.Static | BindingFlags.Public);
              var app = (MauiApp)method!.Invoke(null, null)!;
              return app;
          }
          catch (Exception ex)
          {
    
              var builder = MauiApp.CreateBuilder();
              builder.UseMauiApp<App>();
    
              var msg = ex.Message + "\r\n" + ex.StackTrace;
              if (ex.InnerException != null)
                  msg += "\r\n-----------InnerException--------------------\r\n" + ex.InnerException.ToString();
    
              builder.Services.AddSingleton(ii => new MainPage(msg));
              return builder.Build();
          }
      }
    
    
  2. LunZi.Common的MauiProgram
      public static class MauiProgram
      {
          public static List<string> AssemblyNames { get; set; } = new();
          public static MauiApp CreateMauiApp()
          {
              AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
    
              return Create();
          }
    
          private static MauiApp Create()
          {
              var builder = MauiApp.CreateBuilder();
              builder
                  .UseMauiApp<App>()
                  .UseMauiCommunityToolkit()
                  .UseMauiCommunityToolkitMarkup()
              .ConfigureFonts(fonts =>
              {
                  fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
                  fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
              });
    
    
              builder.AddLunZiService();
              var app = builder.Build();
              app.InitializeLunZi();
              return app;
          }
    
    
          private static Assembly? CurrentDomain_AssemblyResolve(object? sender, ResolveEventArgs args)
          {
              var name = args.Name.Split(',')[0].Trim();
    
              string fullName = Path.Combine(@"c:\plugin\packages", name.EndsWith(".resources") ? Thread.CurrentThread.CurrentCulture.Name : "", name + ".dll");
              if (File.Exists(fullName))
              {
                  AssemblyNames.Add(name);
                  return AssemblyLoadContext.Default.LoadFromAssemblyPath(fullName);
              }
              else
                  return default;
          }
      }
    
    

以后Demo将基本不动,只要修改LunZi.Common,增加其他类库。想着公司刚好要开发Maui的程序,接一下就以公司产品为例,折腾折腾这个插件开发。

哦,我公司是开发酒店自助入住程序的,所以将会有这么一些插件

image