c# 编写 WebAssembly

创建一个.net 7.0类库工程,引用下面的nuget包:

    <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="7.0.5" />
    <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="7.0.5" />
    <PackageReference Include="SkiaSharp.Views.Blazor" Version="2.88.3" />  如果用到SkiaSharp就引入这个

然后把Project sdk改成这样:

<Project Sdk="Microsoft.NET.Sdk.BlazorWebAssembly">

然后c#代码可以这样写:

using Microsoft.AspNetCore.Components.WebAssembly.Hosting;
using Microsoft.JSInterop;

namespace WebAssemblyTest
{
    public class Program
    {
        private static IJSRuntime js;
        private static async Task Main(string[] args)
        {
            var builder = WebAssemblyHostBuilder.CreateDefault(args);
            var host = builder.Build();
            js = host.Services.GetRequiredService<IJSRuntime>();
            RunInSeconds();
            await host.RunAsync();
        }

        static async void RunInSeconds()
        {
            while (true)
            {
                await Task.Delay(2000);
                //调用javascript里面的test方法
                await js.InvokeVoidAsync("test", new byte[] { 0x1, 0x2 });
            }
        }

        /// <summary>
        /// 给js调用的函数
        /// </summary>
        /// <param name="i"></param>
        /// <param name="j"></param>
        /// <returns></returns>
        [JSInvokable]
        public static byte[] Add(int i, int j)
        {
            return new byte[] { (byte)i,(byte)j};
        }
    }
}

js代码这样写:

<html lang="en">
<head>
    <meta charset="UTF-8" />
</head>
<body>
</body>
<script src="_framework/blazor.webassembly.js" autostart="false"></script>
<script>
    function test(r) {
        console.log(r);
        alert(r);
    }
    window.onload = async function () {
        await Blazor.start();
        const r = await DotNet.invokeMethodAsync(
            'WebAssemblyTest',//程序集的名字
            'Add',//要调用的标注了[JSInvokable]方法的名字
            666,//若干参数
            333
        );
        console.log(r);
    };
</script>
</html>

注意编译生成的_framework文件夹必须放在web服务器,并且设置mimeType以便前端可以顺利下载

var provider = new FileExtensionContentTypeProvider();
provider.Mappings[".dll"] = "application/octet-stream";//配置添加新的映射关系
provider.Mappings[".gz"] = "application/octet-stream";
provider.Mappings[".dat"] = "application/octet-stream";
provider.Mappings[".blat"] = "application/octet-stream";
provider.Mappings[".pdb"] = "application/octet-stream";
provider.Mappings[".wasm"] = "application/octet-stream";
app.UseStaticFiles(new StaticFileOptions
{
    ContentTypeProvider = provider,//应用新的映射关系
});

一个SkiaSharp显示图片到canvas的例子

using Microsoft.AspNetCore.Components.WebAssembly.Hosting;
using Microsoft.JSInterop;
using SkiaSharp;
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Runtime.InteropServices;

namespace WebAssemblyTest
{
    public class Program
    {
        private static IJSRuntime js;
        private static async Task Main(string[] args)
        {
            var builder = WebAssemblyHostBuilder.CreateDefault(args);
            var host = builder.Build();
            js = host.Services.GetRequiredService<IJSRuntime>();
            RunInSeconds();
            await host.RunAsync();
        }

        static async void RunInSeconds()
        {
            try
            {

                HttpClient client = new HttpClient();
                using var ret = await client.GetStreamAsync("https://img0.baidu.com/it/u=189915953,3148055061&fm=253&fmt=auto&app=120&f=JPEG?w=1422&h=800");
                var bs = new byte[ret.Length];
                ret.Read(bs , 0 , bs.Length);
                ret.Dispose();
                while (true)
                {
                    using (var ms = new MemoryStream(bs))
                    {
                        ms.Position = 0;
                        using (var skiaBitmap = SKBitmap.Decode(ms))
                        {   
                            // 获取图片的宽度和高度
                            var width = skiaBitmap.Width;
                            var height = skiaBitmap.Height;
                            using (var canvas = new SKCanvas(skiaBitmap))
                            {
                                // 添加文本
                                var paint = new SKPaint
                                {
                                    IsAntialias = true,
                                    Color = SKColors.Blue,
                                    TextAlign = SKTextAlign.Center,
                                    TextSize = 64
                                };
                                canvas.DrawText(DateTime.Now.ToString("测试 HH:mm:ss"), width / 2f, height / 2f, paint);
                            }

                         

                            // 创建一个用于存储像素数据的数组
                            var pixelData = new byte[width * height * 4];

                            // 将像素数据序列化到数组中
                            for (var y = 0; y < height; ++y)
                            {
                                for (var x = 0; x < width; ++x)
                                {
                                    var index = (y * width + x) * 4;
                                    var color = skiaBitmap.GetPixel(x, y);
                                    pixelData[index] = color.Red;
                                    pixelData[index + 1] = color.Green;
                                    pixelData[index + 2] = color.Blue;
                                    pixelData[index + 3] = color.Alpha;
                                }
                            }

                            //调用javascript里面的test方法
                            await js.InvokeVoidAsync("test", pixelData, width, height);
                        }
                    }
                    await Task.Delay(25);
                }
            }
            catch (Exception ex)
            {
                await js.InvokeVoidAsync("showErr", ex.ToString());
            }
            
        }

        /// <summary>
        /// 给js调用的函数
        /// </summary>
        /// <param name="i"></param>
        /// <param name="j"></param>
        /// <returns></returns>
        [JSInvokable]
        public static byte[] Add(int i, int j)
        {
            return new byte[] { (byte)i,(byte)j};
        }
    }
}
<html lang="en">
<head>
    <meta charset="UTF-8" />
</head>
<body>
    <canvas id="myCanvas" style="width:800px;height:800px;"></canvas>
</body>
<script src="_framework/blazor.webassembly.js" autostart="false"></script>
<script>
    function test(data, width, height) {
        const canvas = document.getElementById('myCanvas');
        canvas.style.width = width + "px";
        canvas.style.height = height + "px";
        canvas.width = width;
        canvas.height = height;
        const context = canvas.getContext('2d');
        context.width = width;
        context.height = height;

        const imageData = context.createImageData(width, height);

        for (let i = 0; i < data.length; i += 4) {
            imageData.data[i] = data[i]; // 红色通道
            imageData.data[i + 1] = data[i + 1]; // 绿色通道
            imageData.data[i + 2] = data[i + 2]; // 蓝色通道
            imageData.data[i + 3] = data[i + 3]; // alpha 通道
        }

        context.putImageData(imageData, 0, 0);
    }
    function showErr(err) {
        console.error(err);
    }
    window.onload = async function () {
        await Blazor.start();
    };
</script>
</html>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Blazor WebAssembly是一种Web前端框架,它使用C#和.NET运行时来构建单页面应用程序(SPA)。与传统的JavaScript框架不同,Blazor WebAssembly允许开发人员使用C#编写客户端代码,同时仍然能够实现Web应用程序的所有功能。它的主要优点是易于使用、高性能、可维护性和跨平台支持。Blazor WebAssembly还提供了丰富的UI组件库和可扩展性,使开发人员能够快速构建复杂的Web应用程序。 ### 回答2: Blazor WebAssembly 是一个全新的前端框架,它是由微软推出的。Blazor WebAssembly 的基本思想是通过将 WebAssembly 技术整合到浏览器中,可以直接运行 .NET 代码,通过这种方式来写 SPA(单页应用)。 SPA 指前端不修改页面的情况下,通过 JavaScript 来展示不同的内容。 Blazor WebAssembly 的主要优势是可以写 C# 代码,并且在浏览器中直接运行,省去了 JavaScript 编写的时候需要做的很多工作。在 Blazor WebAssembly 中,通过将 .NET 代码编译成 WebAssembly 字节码,然后将其嵌入到 HTML 页面中,就可以在浏览器中直接运行。 与传统的 Web 应用相比,Blazor WebAssembly 可以使用面向对象的技术,并且可以更好地管理复杂的代码和数据。此外,它还可以轻松地访问后端数据,用于实现灵活的用户界面。 Blazor WebAssembly 可以被用作构建 Web 应用程序的主要工具,在浏览器端提供更好的用户体验。因此,它是现在非常流行的前端框架之一,尤其适用于那些需要更好与 Web 框架集成的企业应用程序。 ### 回答3: Blazor WebAssembly是一个全新的Web开发框架,它使用了WebAssembly这一新技术,使得在Web前端开发领域中,C#语言也可以得到广泛应用。Blazor可以在Web前端通过C#进行开发,而不必再局限于JavaScript,这为开发人员提供了更大的选择空间和效率提升。 Blazor的主要优点之一是,相较于传统的JavaScript框架,它可以在不依赖JavaScript的情况下完成Web前端开发,同时提供了更为可靠的开发体验。Blazor可以借助C#语言消除了在开发过程中大量的JavaScript代码的问题,简化了前端开发过程。 另一个重要的优点是,Blazor将C#语言WebAssembly这一新技术结合起来,提供了更高效的性能和可靠性。在网络较慢或设备配置较低的情况下,使用Blazor可以提供更好的用户体验,而且减少了对后端的依赖。 在使用Blazor开发Web应用时,可以利用已有的 .NET技术栈,比如Entity Framework、LINQ等进行开发,同时还可使用.NET Core的API和扩展库,在开发过程中充分发挥C#语言的优势。 总之,Blazor WebAssembly是一种全新的Web开发框架,它可以在Web前端开发语言上提供更大的选择空间,同时可以借助C#语言WebAssembly提高开发效率,使用Blazor开发Web应用可以简化开发过程、提高应用的性能、可靠性和用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值