返回提交历史
Added
XFEExtension.NetCore.XApp/CompilateResult.cs
+11
-0
Modified
XFEExtension.NetCore.XApp/XAppBuilder.cs
+26
-2
Modified
XFEExtension.NetCore.XApp/XAppExtensions.cs
+9
-1
Modified
XFEExtension.NetCore.XApp/XAppLoader.cs
+30
-9
Modified
XFEExtension.NetCore.XApp/XFEExtension.NetCore.XApp.csproj
+3
-2
XFEstudio/XFEExtension.NetCore.XApp
添加API文档,诊断信息现可被获取
91f61d0
代码差异
5 个文件
+79
-14
@@ -0,0 +1,11 @@
1
using Microsoft.CodeAnalysis;
2
using System.Collections.Immutable;
3
4
namespace XFEExtension.NetCore.XApp;
5
/// <summary>
6
/// XApp编译结果
7
/// </summary>
8
/// <param name="IsCompilateSuccessful">是否编译成功</param>
9
/// <param name="Page">程序主页面</param>
10
/// <param name="Diagnostics">诊断信息</param>
11
public record class CompilateResult(bool IsCompilateSuccessful, Page? Page, ImmutableArray<Diagnostic> Diagnostics) { }
@@ -2,24 +2,48 @@
2
2
3
3
namespace XFEExtension.NetCore.XApp;
4
4
5
/// <summary>
6
/// XApp应用构建器
7
/// </summary>
5
8
[CreateImpl]
6
9
public abstract class XAppBuilder
7
10
{
8
11
internal static Page? CurrentXAppMainPage { get; private set; }
12
/// <summary>
13
/// 主页(Page布局)
14
/// </summary>
9
15
public Page? MainPage { get; set; }
16
/// <summary>
17
/// 主页(Shell布局)
18
/// </summary>
10
19
public Shell? MainShell { get; set; }
20
/// <summary>
21
/// 创建构建器
22
/// </summary>
23
/// <returns></returns>
11
24
public static XAppBuilder CreateBuilder() => new XAppBuilderImpl();
25
/// <summary>
26
/// 使用Shell布局
27
/// </summary>
28
/// <param name="mainShell"></param>
29
/// <returns></returns>
12
30
public XAppBuilder WithShellDev(Shell mainShell)
13
31
{
14
32
MainShell = mainShell;
15
33
return this;
16
34
}
17
35
/// <summary>
36
/// 使用Page布局
37
/// </summary>
38
/// <param name="mainPage"></param>
39
/// <returns></returns>
18
40
public XAppBuilder WithPageDev(Page mainPage)
19
41
{
20
42
MainPage = mainPage;
21
43
return this;
22
44
}
23
45
/// <summary>
46
/// 构建并运行
47
/// </summary>
24
48
public void BuildAndRun() => CurrentXAppMainPage = MainPage ?? MainShell;
25
49
}
@@ -1,6 +1,14 @@
1
1
namespace XFEExtension.NetCore.XApp.Extensions;
2
2
3
/// <summary>
4
/// XApp拓展
5
/// </summary>
3
6
public static class XAppExtensions
4
7
{
5
public static async Task<Page?> GetMainPage(this Core.XApp xApp) => await XAppLoader.GetMainPage(xApp);
8
/// <summary>
9
/// 获取主页面
10
/// </summary>
11
/// <param name="xApp">XApp应用</param>
12
/// <returns></returns>
13
public static async Task<CompilateResult> GetMainPage(this Core.XApp xApp) => await XAppLoader.GetMainPage(xApp);
6
14
}
@@ -1,38 +1,58 @@
1
1
using Microsoft.CodeAnalysis;
2
2
using Microsoft.CodeAnalysis.CSharp;
3
using System.Collections.Immutable;
3
4
using System.Diagnostics;
4
5
using System.Reflection;
5
6
using XFEExtension.NetCore.XApp.Core;
6
using XFEExtension.NetCore.XFETransform;
7
7
8
8
namespace XFEExtension.NetCore.XApp;
9
9
10
/// <summary>
11
/// XApp加载器
12
/// </summary>
10
13
public static class XAppLoader
11
14
{
12
public static async Task<Page?> GetMainPage(Core.XApp xApp)
15
/// <summary>
16
/// 编译并获取主页面
17
/// </summary>
18
/// <param name="xApp">XApp对象</param>
19
/// <returns>编译结果信息</returns>
20
public static async Task<CompilateResult> GetMainPage(Core.XApp xApp)
13
21
{
14
var mainMethod = LoadAssemblyFromXApp(xApp)?.EntryPoint;
22
var mainMethod = LoadAssemblyFromXApp(xApp, out var diagnostic)?.EntryPoint;
15
23
if (mainMethod is not null)
16
24
{
17
25
if (mainMethod?.ReturnType == typeof(Task))
18
26
await (Task)mainMethod.Invoke(null, [Array.Empty<string>()])!;
19
27
else
20
28
mainMethod?.Invoke(null, [Array.Empty<string>()]);
21
return XAppBuilder.CurrentXAppMainPage;
29
var pageIsNotNull = XAppBuilder.CurrentXAppMainPage is not null;
30
return new CompilateResult(pageIsNotNull, XAppBuilder.CurrentXAppMainPage, diagnostic);
22
31
}
23
32
else
24
33
{
25
return null;
34
return new CompilateResult(false, null, diagnostic);
26
35
}
27
36
}
28
29
public static Assembly? LoadAssemblyFromXApp(Core.XApp xApp) => CompilateCode(xApp.AppFiles.CodeFiles);
30
public static Assembly? CompilateCode(params XAppCode[] xAppCodes)
37
/// <summary>
38
/// 从XApp对象中加载程序集
39
/// </summary>
40
/// <param name="xApp">XApp对象</param>
41
/// <param name="diagnostic">诊断信息</param>
42
/// <returns></returns>
43
public static Assembly? LoadAssemblyFromXApp(Core.XApp xApp, out ImmutableArray<Diagnostic> diagnostic) => CompilateCode(out diagnostic, xApp.AppFiles.CodeFiles);
44
/// <summary>
45
/// 编译代码
46
/// </summary>
47
/// <param name="diagnostics">诊断信息</param>
48
/// <param name="xAppCodes">XApp的代码文件</param>
49
/// <returns></returns>
50
public static Assembly? CompilateCode(out ImmutableArray<Diagnostic> diagnostics, params XAppCode[] xAppCodes)
31
51
{
32
52
var syntaxTrees = new List<SyntaxTree>();
33
53
foreach (var xAppCode in xAppCodes)
34
54
{
35
if (xAppCode.FileType == XAppFileType.XFML)
55
if (xAppCode.FileType == XAppFileType.XFML || xAppCode.FileType == XAppFileType.Resource || xAppCode.FileType == XAppFileType.Image)
36
56
continue;
37
57
var fileName = Path.GetFileNameWithoutExtension(xAppCode.FileName);
38
58
var split = fileName.Split('.');
@@ -95,6 +115,7 @@ public static class XAppLoader
95
115
else
96
116
Trace.WriteLine(diagnostic.ToString());
97
117
}
118
diagnostics = result.Diagnostics;
98
119
if (result.Success)
99
120
{
100
121
assemblyBytes = stream.ToArray();
@@ -15,9 +15,10 @@
15
15
<PackageIcon>logoIcon.png</PackageIcon>
16
16
<RepositoryUrl>https://github.com/XFEstudio/XFEExtension.NetCore.XApp</RepositoryUrl>
17
17
<PackageTags>XApp;XFE</PackageTags>
18
<PackageReleaseNotes>优化程序解包结构</PackageReleaseNotes>
18
<PackageReleaseNotes>添加API文档,诊断信息现可被获取</PackageReleaseNotes>
19
19
<PackageLicenseFile>LICENSE.txt</PackageLicenseFile>
20
<Version>1.0.3</Version>
20
<Version>1.1.0</Version>
21
<GenerateDocumentationFile>True</GenerateDocumentationFile>
21
22
</PropertyGroup>
22
23
23
24
<ItemGroup>