Skip to content

Commit 1a77c34

Browse files
author
linzhijun
committed
简化 WebAssembly 操作
1 parent 222deb6 commit 1a77c34

File tree

13 files changed

+270
-37
lines changed

13 files changed

+270
-37
lines changed
Lines changed: 93 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,108 @@
11
namespace ToolGood.Algorithm.WebAssembly
22
{
3-
using Microsoft.AspNetCore.Components.WebAssembly.Hosting;
43
using Microsoft.JSInterop;
54
using ToolGood.Algorithm;
5+
using ToolGood.Algorithm.Enums;
6+
67
public class Program
78
{
8-
private static async Task Main(string[] args)
9+
private static void Main(string[] args)
10+
{
11+
}
12+
13+
[JSInvokable]
14+
public static string TryEvaluateString(string exp, string def = null, string data = null, string option = null)
915
{
16+
AlgorithmEngine ae;
17+
if (option == null) {
18+
ae = new AlgorithmEngine();
19+
} else {
20+
var ops = System.Text.Json.JsonSerializer.Deserialize<Dictionary<string, object>>(option);
21+
ae = new AlgorithmEngine(bool.Parse(ops["IgnoreCase"].ToString()));
22+
ae.UseExcelIndex = bool.Parse(ops["UseExcelIndex"].ToString());
23+
ae.UseTempDict = bool.Parse(ops["UseTempDict"].ToString());
24+
ae.UseLocalTime = bool.Parse(ops["UseLocalTime"].ToString());
25+
ae.DistanceUnit = (DistanceUnitType)(int.Parse(ops["DistanceUnit"].ToString()));
26+
ae.AreaUnit = (AreaUnitType)(int.Parse(ops["AreaUnit"].ToString()));
27+
ae.VolumeUnit = (VolumeUnitType)(int.Parse(ops["VolumeUnit"].ToString()));
28+
ae.MassUnit = (MassUnitType)(int.Parse(ops["MassUnit"].ToString()));
29+
}
30+
if (data != null) {
31+
ae.AddParameterFromJson(data);
32+
}
33+
return ae.TryEvaluate(exp, def);
1034
}
1135

12-
13-
///// <summary>
14-
///// 给js调用的函数
15-
///// </summary>
16-
///// <param name="i"></param>
17-
///// <param name="j"></param>
18-
///// <returns></returns>
19-
//[JSInvokable]
20-
//public static byte[] Add(int i, int j)
21-
//{
22-
// return new byte[] { (byte)i, (byte)j };
23-
//}
36+
[JSInvokable]
37+
public static decimal TryEvaluateNumber(string exp, decimal def, string data = null, string option = null)
38+
{
39+
AlgorithmEngine ae;
40+
if (option == null) {
41+
ae = new AlgorithmEngine();
42+
} else {
43+
var ops = System.Text.Json.JsonSerializer.Deserialize<Dictionary<string, object>>(option);
44+
ae = new AlgorithmEngine(bool.Parse(ops["IgnoreCase"].ToString()));
45+
ae.UseExcelIndex = bool.Parse(ops["UseExcelIndex"].ToString());
46+
ae.UseTempDict = bool.Parse(ops["UseTempDict"].ToString());
47+
ae.UseLocalTime = bool.Parse(ops["UseLocalTime"].ToString());
48+
ae.DistanceUnit = (DistanceUnitType)(int.Parse(ops["DistanceUnit"].ToString()));
49+
ae.AreaUnit = (AreaUnitType)(int.Parse(ops["AreaUnit"].ToString()));
50+
ae.VolumeUnit = (VolumeUnitType)(int.Parse(ops["VolumeUnit"].ToString()));
51+
ae.MassUnit = (MassUnitType)(int.Parse(ops["MassUnit"].ToString()));
52+
}
53+
if (data != null) {
54+
ae.AddParameterFromJson(data);
55+
}
56+
return ae.TryEvaluate(exp, def);
57+
}
2458

2559
[JSInvokable]
26-
public static string TryEvaluate(string exp)
60+
public static bool TryEvaluateBool(string exp, bool def, string data = null, string option = null)
2761
{
28-
var ae = new AlgorithmEngine();
29-
return ae.TryEvaluate(exp, null);
62+
AlgorithmEngine ae;
63+
if (option == null) {
64+
ae = new AlgorithmEngine();
65+
} else {
66+
var ops = System.Text.Json.JsonSerializer.Deserialize<Dictionary<string, object>>(option);
67+
ae = new AlgorithmEngine(bool.Parse(ops["IgnoreCase"].ToString()));
68+
ae.UseExcelIndex = bool.Parse(ops["UseExcelIndex"].ToString());
69+
ae.UseTempDict = bool.Parse(ops["UseTempDict"].ToString());
70+
ae.UseLocalTime = bool.Parse(ops["UseLocalTime"].ToString());
71+
ae.DistanceUnit = (DistanceUnitType)(int.Parse(ops["DistanceUnit"].ToString()));
72+
ae.AreaUnit = (AreaUnitType)(int.Parse(ops["AreaUnit"].ToString()));
73+
ae.VolumeUnit = (VolumeUnitType)(int.Parse(ops["VolumeUnit"].ToString()));
74+
ae.MassUnit = (MassUnitType)(int.Parse(ops["MassUnit"].ToString()));
75+
}
76+
if (data != null) {
77+
ae.AddParameterFromJson(data);
78+
}
79+
return ae.TryEvaluate(exp, def);
3080
}
81+
82+
[JSInvokable]
83+
public static DateTime TryEvaluateDateTime(string exp, DateTime def, string data = null, string option = null)
84+
{
85+
AlgorithmEngine ae;
86+
if (option == null) {
87+
ae = new AlgorithmEngine();
88+
} else {
89+
var ops = System.Text.Json.JsonSerializer.Deserialize<Dictionary<string, object>>(option);
90+
ae = new AlgorithmEngine(bool.Parse(ops["IgnoreCase"].ToString()));
91+
ae.UseExcelIndex = bool.Parse(ops["UseExcelIndex"].ToString());
92+
ae.UseTempDict = bool.Parse(ops["UseTempDict"].ToString());
93+
ae.UseLocalTime = bool.Parse(ops["UseLocalTime"].ToString());
94+
ae.DistanceUnit = (DistanceUnitType)(int.Parse(ops["DistanceUnit"].ToString()));
95+
ae.AreaUnit = (AreaUnitType)(int.Parse(ops["AreaUnit"].ToString()));
96+
ae.VolumeUnit = (VolumeUnitType)(int.Parse(ops["VolumeUnit"].ToString()));
97+
ae.MassUnit = (MassUnitType)(int.Parse(ops["MassUnit"].ToString()));
98+
}
99+
if (data != null) {
100+
ae.AddParameterFromJson(data);
101+
}
102+
return ae.TryEvaluate(exp, def);
103+
}
104+
105+
106+
31107
}
32108
}

csharp/ToolGood.Algorithm.WebAssembly/ToolGood.Algorithm.WebAssembly.csproj

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,10 @@
33
<PropertyGroup>
44
<TargetFramework>net8.0</TargetFramework>
55
<ImplicitUsings>enable</ImplicitUsings>
6-
<Nullable>enable</Nullable>
76
</PropertyGroup>
87

98
<ItemGroup>
109
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="8.0.4" />
11-
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="8.0.4" />
1210
<!--<PackageReference Include="SkiaSharp.Views.Blazor" Version="2.88.8" />-->
1311
</ItemGroup>
1412

csharp/ToolGood.Algorithm2.WebTest/Pages/Index.cshtml

Lines changed: 170 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,30 +3,192 @@
33
@{
44
Layout = null;
55
}
6-
<html lang="en">
6+
<html>
77
<head>
88
<meta charset="UTF-8" />
99
</head>
1010
<body>
1111
编译ToolGood.Algorithm.WebAssembly项目,生成文件夹下的wwwroot文件夹中的_framework文件夹中就是生成的WebAssembly和相关文件
1212
<br />
13-
我们运行前端项目. 由于Blazor会生成blat、dll等不被Web服务器默认接受的文件类型,所以请确保在Web服务器上为如下格式的文件配置MimeType:.pdb、.blat、.dat、.dll、.json、.wasm、.woff、.woff2。
14-
15-
13+
我们运行前端项目. 由于Blazor会生成blat、dll等不被Web服务器默认接受的文件类型,所以请确保在Web服务器上为如下格式的文件配置MimeType:.gz、.dat、.wasm
14+
15+
1616
<pre>
17+
AreaUnitType = new class {
18+
constructor() {
19+
this.MM2 = 11;
20+
this.CM2 = 12;
21+
this.DM2 = 13;
22+
this.M2 = 14;
23+
this.KM2 = 15;
24+
}
25+
}();
26+
DistanceUnitType = new class {
27+
constructor() {
28+
this.MM = 1;
29+
this.CM = 2;
30+
this.DM = 3;
31+
this.M = 4;
32+
this.KM = 5;
33+
}
34+
}();
35+
MassUnitType = new class {
36+
constructor() {
37+
this.G = 31;
38+
this.KG = 32;
39+
this.T = 33;
40+
}
41+
}();
42+
VolumeUnitType = new class {
43+
constructor() {
44+
this.MM3 = 21;
45+
this.CM3 = 22;
46+
this.DM3 = 23;
47+
this.M3 = 24;
48+
this.KM3 = 25;
49+
}
50+
}();
51+
AlgorithmEngine = new class {
52+
constructor() {
53+
this.UseExcelIndex = true;
54+
this.UseTempDict = false;
55+
this.UseLocalTime = false;
56+
this.DistanceUnit = DistanceUnitType.M;
57+
this.AreaUnit = AreaUnitType.M2;
58+
this.VolumeUnit = VolumeUnitType.M3;
59+
this.MassUnit = MassUnitType.KG;
60+
this.IgnoreCase = false;
61+
}
62+
63+
createOption = function () {
64+
var data = {
65+
UseExcelIndex: this.UseExcelIndex,
66+
UseTempDict: this.UseTempDict,
67+
UseLocalTime: this.UseLocalTime,
68+
DistanceUnit: this.DistanceUnit,
69+
AreaUnit: this.AreaUnit,
70+
VolumeUnit: this.VolumeUnit,
71+
MassUnit: this.MassUnit,
72+
IgnoreCase: this.IgnoreCase,
73+
}
74+
return JSON.stringify(data);
75+
}
76+
77+
TryEvaluateString = async function (exp, def, data) {
78+
return await DotNet.invokeMethodAsync('ToolGood.Algorithm.WebAssembly', 'TryEvaluateString', exp, def, data, this.createOption());
79+
}
80+
TryEvaluateNumber = async function (exp, def, data) {
81+
return await DotNet.invokeMethodAsync('ToolGood.Algorithm.WebAssembly', 'TryEvaluateNumber', exp, def, data, this.createOption());
82+
}
83+
TryEvaluateBool = async function (exp, def, data) {
84+
return await DotNet.invokeMethodAsync('ToolGood.Algorithm.WebAssembly', 'TryEvaluateBool', exp, def, data, this.createOption());
85+
}
86+
TryEvaluateDateTime = async function (exp, def, data) {
87+
return await DotNet.invokeMethodAsync('ToolGood.Algorithm.WebAssembly', 'TryEvaluateDateTime', exp, def, data, this.createOption());
88+
}
89+
}();
90+
91+
1792
window.onload = async function () {
1893
await Blazor.start();
19-
constr = await DotNet.invokeMethodAsync('ToolGood.Algorithm.WebAssembly', 'TryEvaluate', '1+1');
20-
alert(constr);
94+
r = await AlgorithmEngine.TryEvaluateString("'S' & 1", "")
95+
alert("'S' & 1 =>" + r);
96+
r = await AlgorithmEngine.TryEvaluateNumber("1+2", 0)
97+
alert("1+2 =>" + r);
98+
r = await AlgorithmEngine.TryEvaluateBool("1=1", false)
99+
alert("1=1 =>" + r);
100+
r = await AlgorithmEngine.TryEvaluateDateTime("date(2014,1,2)", '2024-01-11')
101+
alert('date(2014,1,2) =>' + r);
21102
};
22103
</pre>
23104
</body>
24105
<script src="_framework/blazor.webassembly.js" autostart="false"></script>
25106
<script>
107+
AreaUnitType = new class {
108+
constructor() {
109+
this.MM2 = 11;
110+
this.CM2 = 12;
111+
this.DM2 = 13;
112+
this.M2 = 14;
113+
this.KM2 = 15;
114+
}
115+
}();
116+
DistanceUnitType = new class {
117+
constructor() {
118+
this.MM = 1;
119+
this.CM = 2;
120+
this.DM = 3;
121+
this.M = 4;
122+
this.KM = 5;
123+
}
124+
}();
125+
MassUnitType = new class {
126+
constructor() {
127+
this.G = 31;
128+
this.KG = 32;
129+
this.T = 33;
130+
}
131+
}();
132+
VolumeUnitType = new class {
133+
constructor() {
134+
this.MM3 = 21;
135+
this.CM3 = 22;
136+
this.DM3 = 23;
137+
this.M3 = 24;
138+
this.KM3 = 25;
139+
}
140+
}();
141+
AlgorithmEngine = new class {
142+
constructor() {
143+
this.UseExcelIndex = true;
144+
this.UseTempDict = false;
145+
this.UseLocalTime = false;
146+
this.DistanceUnit = DistanceUnitType.M;
147+
this.AreaUnit = AreaUnitType.M2;
148+
this.VolumeUnit = VolumeUnitType.M3;
149+
this.MassUnit = MassUnitType.KG;
150+
this.IgnoreCase = false;
151+
}
152+
153+
createOption = function () {
154+
var data = {
155+
UseExcelIndex: this.UseExcelIndex,
156+
UseTempDict: this.UseTempDict,
157+
UseLocalTime: this.UseLocalTime,
158+
DistanceUnit: this.DistanceUnit,
159+
AreaUnit: this.AreaUnit,
160+
VolumeUnit: this.VolumeUnit,
161+
MassUnit: this.MassUnit,
162+
IgnoreCase: this.IgnoreCase,
163+
}
164+
return JSON.stringify(data);
165+
}
166+
167+
TryEvaluateString = async function (exp, def, data) {
168+
return await DotNet.invokeMethodAsync('ToolGood.Algorithm.WebAssembly', 'TryEvaluateString', exp, def, data, this.createOption());
169+
}
170+
TryEvaluateNumber = async function (exp, def, data) {
171+
return await DotNet.invokeMethodAsync('ToolGood.Algorithm.WebAssembly', 'TryEvaluateNumber', exp, def, data, this.createOption());
172+
}
173+
TryEvaluateBool = async function (exp, def, data) {
174+
return await DotNet.invokeMethodAsync('ToolGood.Algorithm.WebAssembly', 'TryEvaluateBool', exp, def, data, this.createOption());
175+
}
176+
TryEvaluateDateTime = async function (exp, def, data) {
177+
return await DotNet.invokeMethodAsync('ToolGood.Algorithm.WebAssembly', 'TryEvaluateDateTime', exp, def, data, this.createOption());
178+
}
179+
}();
180+
181+
26182
window.onload = async function () {
27183
await Blazor.start();
28-
constr = await DotNet.invokeMethodAsync('ToolGood.Algorithm.WebAssembly', 'TryEvaluate', '1+1');
29-
alert(constr);
184+
r = await AlgorithmEngine.TryEvaluateString("'S' & 1", "")
185+
alert("'S' & 1 =>" + r);
186+
r = await AlgorithmEngine.TryEvaluateNumber("1+2", 0)
187+
alert("1+2 =>" + r);
188+
r = await AlgorithmEngine.TryEvaluateBool("1=1", false)
189+
alert("1=1 =>" + r);
190+
r = await AlgorithmEngine.TryEvaluateDateTime("date(2014,1,2)", '2024-01-11')
191+
alert('date(2014,1,2) =>' + r);
30192
};
31193
</script>
32194
</html>

csharp/ToolGood.Algorithm2.WebTest/Program.cs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,9 @@ public static void Main(string[] args)
1818
app.UseExceptionHandler("/Error");
1919
}
2020
var provider = new FileExtensionContentTypeProvider();
21-
provider.Mappings[".dll"] = "application/octet-stream";//配置添加新的映射关系
2221
provider.Mappings[".gz"] = "application/octet-stream";
2322
provider.Mappings[".dat"] = "application/octet-stream";
24-
provider.Mappings[".blat"] = "application/octet-stream";
25-
provider.Mappings[".pdb"] = "application/octet-stream";
26-
provider.Mappings[".wasm"] = "application/octet-stream";
23+
provider.Mappings[".wasm"] = "application/wasm";
2724
app.UseStaticFiles(new StaticFileOptions {
2825
ContentTypeProvider = provider,//应用新的映射关系
2926
});
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

0 commit comments

Comments
 (0)