<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12
      Maui Blazor 中文社區 QQ群:645660665

      動態編譯一個新的 NativeApi 類

      要動態編譯一個新的 NativeApi 類,可以按照以下步驟進行:

      1. 創建一個新的 NativeApi 類。
      2. 在 NativeApi 類中定義所需的方法和屬性。
      3. 在 MainPage 中實例化并使用新的 NativeApi 類。

      使用 Roslyn 編譯器來動態編譯 C# 源代碼并將其加載到內存中

      安裝 Microsoft.CodeAnalysis.CSharp NuGet 包

      using Microsoft.CodeAnalysis;
      using Microsoft.CodeAnalysis.CSharp;
      using Microsoft.CodeAnalysis.Emit;
      using System.Reflection;
      
      /// <summary>
      /// 代碼來動態編譯和加載 C# 源代碼
      /// </summary>
      public class DynamicCompiler
      {
          /// <summary>
          /// 編譯并加載代碼
          /// </summary>
          /// <param name="code"></param>
          /// <param name="typeName"></param>
          /// <returns></returns>
          public static object? CompileAndLoad(string code, string typeName)
          {
              var syntaxTree = CSharpSyntaxTree.ParseText(code);
      
              var references = AppDomain.CurrentDomain.GetAssemblies()
                  .Where(a => !a.IsDynamic)
                  .Select(a => MetadataReference.CreateFromFile(a.Location))
                  .Cast<MetadataReference>();
      
              var compilation = CSharpCompilation.Create("DynamicAssembly")
                  .WithOptions(new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary))
                  .AddReferences(references)
                  .AddSyntaxTrees(syntaxTree);
      
              using var ms = new MemoryStream();
              EmitResult result = compilation.Emit(ms);
      
              if (!result.Success)
              {
                  var failures = result.Diagnostics.Where(diagnostic =>
                      diagnostic.IsWarningAsError ||
                      diagnostic.Severity == DiagnosticSeverity.Error);
      
                  foreach (var diagnostic in failures)
                  {
                      Console.Error.WriteLine($"{diagnostic.Id}: {diagnostic.GetMessage()}");
                  }
      
                  return null;
              }
              else
              {
                  ms.Seek(0, SeekOrigin.Begin);
                  var assembly = Assembly.Load(ms.ToArray());
                  var type = assembly.GetType(typeName);
                  return Activator.CreateInstance(type!);
              }
          }
      }
      
      using MauiPlus;
      using System.Reflection.Emit;
      using System.Reflection;
      
      namespace MauiPlusDemo
      {
          public partial class MainPage : ContentPage
          {
              private NativeBridge? api;
      
              public MainPage()
              {
                  InitializeComponent();
      
                  //附加本機功能處理
                  WebView? wvBrowser = FindByName("webView") as WebView;
                  if (wvBrowser != null)
                  {
                      LoadHtmlToWebView(wvBrowser);
                      var nativeApiInstance = CreateNativeApiInstance();
                      TestCreateNativeApiInstance(nativeApiInstance);
                      api = new NativeBridge(wvBrowser);
                      //api.AddTarget("dialogs", new NativeApi());
                      api.AddTarget("dialogs", nativeApiInstance!);
                  }
      
      #if MACCATALYST
          Microsoft.Maui.Handlers.WebViewHandler.Mapper.AppendToMapping("Inspect", (handler, view) =>
          {
              if (OperatingSystem.IsMacCatalystVersionAtLeast(16, 6))
                  handler.PlatformView.Inspectable = true;
          });
      #endif
              }
      
              private async void LoadHtmlToWebView(WebView wvBrowser)
              {
                  // 加載本地 HTML 文件
                  var htmlSource = new HtmlWebViewSource
                  {
                      BaseUrl = FileSystem.AppDataDirectory,
                      Html = await LoadLocalHtml("demo.html")
                  };
                  wvBrowser.Source = htmlSource;
              }
      
              private async Task<string> LoadLocalHtml(string fileName)
              {
                  using var stream = await FileSystem.OpenAppPackageFileAsync(fileName);
                  using var reader = new StreamReader(stream);
      
                  var contents = await reader.ReadToEndAsync();
                  return contents;
              }
      
              private async void TestCreateNativeApiInstance(object? nativeApiInstance)
              {
                  if (nativeApiInstance != null)
                  {
                      Console.WriteLine("Dynamic compilation and loading succeeded.");
      
                      // 打印出所有方法名稱,確認方法確實存在
                      var methods = nativeApiInstance.GetType().GetMethods(BindingFlags.Instance | BindingFlags.Public);
                      foreach (var methodInfo in methods)
                      {
                          Console.WriteLine($"Found method: {methodInfo.Name}");
                      }
      
                      // 調用異步方法
                      var method = nativeApiInstance.GetType().GetMethod("get_config", BindingFlags.Instance | BindingFlags.Public);
                      if (method != null)
                      {
                          var task = (Task<string>)method.Invoke(nativeApiInstance, null);
                          string result = await task;
                          Console.WriteLine(result);
                      }
                      else
                      {
                          Console.WriteLine("Method 'get_config' not found.");
                      }
                  }
                  else
                  {
                      Console.WriteLine("Dynamic compilation and loading failed.");
                  }
              }
      
              private object? CreateNativeApiInstance()
              {
                  string code = """
      using System;
      using System.Threading.Tasks;
      
      public class NativeApi
      {
          public string set_config()
          {
              return "set_config ok";
          }
      
          public async Task<string> get_config()
          {
              await Task.Delay(200); // 模擬異步操作
              return "get_config 123";
          }
      
          public async Task<string> open_file_dialog()
          {
              await Task.Delay(500); // 模擬異步操作
              return "open_file_dialog ok";
          }
      
          public string save_file(string content, string filename)
          {
              return "save_file ok";
          }
      }
      """;
      
                  return DynamicCompiler.CompileAndLoad(code, "NativeApi");
              }
          }
      
      }
      
      

      以下是Reflection.Emit方式,沒那么直觀

      using MauiPlus;
      using System.Reflection.Emit;
      using System.Reflection;
      
      namespace MauiPlusDemo
      {
          public partial class MainPage : ContentPage
          {
              private NativeBridge? api;
      
              public MainPage()
              {
                  InitializeComponent();
      
                  //附加本機功能處理
                  WebView? wvBrowser = FindByName("webView") as WebView;
                  if (wvBrowser != null)
                  {
                      LoadHtmlToWebView(wvBrowser);
                      var nativeApiInstance = CreateNativeApiInstance();
                      api = new NativeBridge(wvBrowser);
                      //api.AddTarget("dialogs", new NativeApi());
                      api.AddTarget("dialogs", nativeApiInstance!);
                  }
      
      #if MACCATALYST
          Microsoft.Maui.Handlers.WebViewHandler.Mapper.AppendToMapping("Inspect", (handler, view) =>
          {
              if (OperatingSystem.IsMacCatalystVersionAtLeast(16, 6))
                  handler.PlatformView.Inspectable = true;
          });
      #endif
              }
      
              private async void LoadHtmlToWebView(WebView wvBrowser)
              {
                  // 加載本地 HTML 文件
                  var htmlSource = new HtmlWebViewSource
                  {
                      BaseUrl = FileSystem.AppDataDirectory,
                      Html = await LoadLocalHtml("demo.html")
                  };
                  wvBrowser.Source = htmlSource;
              }
      
              private async Task<string> LoadLocalHtml(string fileName)
              {
                  using var stream = await FileSystem.OpenAppPackageFileAsync(fileName);
                  using var reader = new StreamReader(stream);
      
                  var contents = await reader.ReadToEndAsync();
                  return contents;
              }
      
              private object? CreateNativeApiInstance()
              {
                  var assemblyName = new AssemblyName("DynamicAssembly");
                  var assemblyBuilder = AssemblyBuilder.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run);
                  var moduleBuilder = assemblyBuilder.DefineDynamicModule("MainModule");
                  var typeBuilder = moduleBuilder.DefineType("NativeApi", TypeAttributes.Public);
      
                  // 定義 get_config 異步方法
                  var get_configMethodBuilder = typeBuilder.DefineMethod("get_config", MethodAttributes.Public, typeof(Task<string>), Type.EmptyTypes);
                  var get_configIlGenerator = get_configMethodBuilder.GetILGenerator();
                  get_configIlGenerator.Emit(OpCodes.Ldstr, "Hello from dynamically generated NativeApi!");
                  get_configIlGenerator.Emit(OpCodes.Ret);
      
                  // 定義 GetMessage 方法
                  var methodBuilder = typeBuilder.DefineMethod("GetMessage", MethodAttributes.Public, typeof(string), Type.EmptyTypes);
                  var ilGenerator = methodBuilder.GetILGenerator();
                  ilGenerator.Emit(OpCodes.Ldstr, "Hello from dynamically generated NativeApi!");
                  ilGenerator.Emit(OpCodes.Ret);
      
                  // 定義 Add 方法
                  var addMethodBuilder = typeBuilder.DefineMethod("Add", MethodAttributes.Public, typeof(int), new[] { typeof(int), typeof(int) });
                  var addIlGenerator = addMethodBuilder.GetILGenerator();
                  addIlGenerator.Emit(OpCodes.Ldarg_1);
                  addIlGenerator.Emit(OpCodes.Ldarg_2);
                  addIlGenerator.Emit(OpCodes.Add);
                  addIlGenerator.Emit(OpCodes.Ret);
      
                  // 定義 Subtract 方法
                  var subtractMethodBuilder = typeBuilder.DefineMethod("Subtract", MethodAttributes.Public, typeof(int), new[] { typeof(int), typeof(int) });
                  var subtractIlGenerator = subtractMethodBuilder.GetILGenerator();
                  subtractIlGenerator.Emit(OpCodes.Ldarg_1);
                  subtractIlGenerator.Emit(OpCodes.Ldarg_2);
                  subtractIlGenerator.Emit(OpCodes.Sub);
                  subtractIlGenerator.Emit(OpCodes.Ret);
      
                  // 定義 Multiply 方法
                  var multiplyMethodBuilder = typeBuilder.DefineMethod("Multiply", MethodAttributes.Public, typeof(int), new[] { typeof(int), typeof(int) });
                  var multiplyIlGenerator = multiplyMethodBuilder.GetILGenerator();
                  multiplyIlGenerator.Emit(OpCodes.Ldarg_1);
                  multiplyIlGenerator.Emit(OpCodes.Ldarg_2);
                  multiplyIlGenerator.Emit(OpCodes.Mul);
                  multiplyIlGenerator.Emit(OpCodes.Ret);
      
      
                  // 定義 Divide 方法
                  var divideMethodBuilder = typeBuilder.DefineMethod("Divide", MethodAttributes.Public, typeof(int), new[] { typeof(int), typeof(int) });
                  var divideIlGenerator = divideMethodBuilder.GetILGenerator();
      
                  var endLabel = divideIlGenerator.DefineLabel();
                  var catchLabel = divideIlGenerator.BeginExceptionBlock();
      
                  // try block
                  divideIlGenerator.Emit(OpCodes.Ldarg_1);
                  divideIlGenerator.Emit(OpCodes.Ldarg_2);
                  divideIlGenerator.Emit(OpCodes.Div);
                  divideIlGenerator.Emit(OpCodes.Stloc_0);
                  divideIlGenerator.Emit(OpCodes.Leave_S, endLabel);
      
                  // catch block
                  divideIlGenerator.BeginCatchBlock(typeof(DivideByZeroException));
                  divideIlGenerator.Emit(OpCodes.Ldc_I4_0);
                  divideIlGenerator.Emit(OpCodes.Stloc_0);
                  divideIlGenerator.Emit(OpCodes.Leave_S, endLabel);
      
                  divideIlGenerator.EndExceptionBlock();
                  divideIlGenerator.MarkLabel(endLabel);
                  divideIlGenerator.Emit(OpCodes.Ldloc_0);
                  divideIlGenerator.Emit(OpCodes.Ret);
      
                  var nativeApiType = typeBuilder.CreateType();
                  return Activator.CreateInstance(nativeApiType);
              }
          }
      
      }
      
      posted @ 2025-02-12 07:16  AlexChow  閱讀(278)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 国产成人亚洲欧美二区综合| 国产久爱免费精品视频| 无码囯产精品一区二区免费| 国产一区二区亚洲av| 亚洲精品美女一区二区| 国产亚洲精品久久综合阿香| 国产suv精品一区二区四| 高h纯肉无码视频在线观看| 色欲久久综合亚洲精品蜜桃| 国产精品成人午夜福利| 日韩在线观看精品亚洲| 精品人妻av综合一区二区| 大伊香蕉精品一区视频在线| 免费国产一级特黄aa大片在线| 久久精品A一国产成人免费网站 | 国产午夜福利高清在线观看| 国产精品理论片| 亚洲香蕉av一区二区蜜桃| 久久一日本综合色鬼综合色| 狼色精品人妻在线视频| 久久SE精品一区精品二区| 久久青青草原精品国产app| 成人午夜伦理在线观看| 宜阳县| 国产成人a∨激情视频厨房| 欧美大胆老熟妇乱子伦视频| 亚洲欧美日韩综合久久| 白丝乳交内射一二三区| 午夜成人性爽爽免费视频| 国产中文字幕久久黄色片| 九九综合va免费看| 四虎永久免费精品视频| 国产线播放免费人成视频播放| 乱色欧美激惰| 国产区成人精品视频| 国产成人亚洲精品在线看| 影音先锋男人站| 97在线视频人妻无码| 国产精品无码a∨麻豆| 国产91丝袜在线观看| 中国孕妇变态孕交xxxx|