34.7 发布桌面程序(WinForm/WPF)
以下内容仅限 Furion 4.8.7.28 +
版本使用。
Furion
框架灵活的架构模式使得 Web
和各客户端(WinForm/WPF/Console
) 项目之间迁移变得非常简单,只 需要极少数修改即可实现无缝迁移。
通过这种方式可以实现类似前端的 Electron/Tauri
混合式开发。
本章节提供如何将 Web
项目发布(迁移)到 WinForm/WPF
中,同样也适合控制台应用程序。
34.7.1 迁移步骤
34.7.1.1 创建 WinForm/WPF
项目
通过 Visual Studio
创建 WinForm/WPF
项目,同样适合控制台项目。
34.7.1.2 初始化 WinForm/WPF
配置
WinForm
初始化
namespace WinFormsApp1;
internal static class Program
{
[STAThread]
private static void Main()
{
Serve.RunNative(RunOptions.Default); // 默认 5000 端口,如果出现占用,推荐使用下面的方式
// Serve.RunNative(RunOptions.Default, Serve.IdleHost.Urls); // 随机端口
ApplicationConfiguration.Initialize();
Application.Run(Native.CreateInstance<Form1>());
}
}
Web
主机环境默认情况下,通过 WinForm
启动 Web
主机环境总是为 Production
,但在开发阶段可能会出现配置加载错误问题,这时只需要添加 ConfigureOptions
配置即可,如:
Serve.RunNative(RunOptions.Default
.ConfigureOptions(new WebApplicationOptions
{
// Debugger.IsAttached 可判断释放为 Debug 模式
EnvironmentName = Debugger.IsAttached ? "Development" : default
}));
WPF
初始化
using System.Windows;
namespace WpfApp1;
public partial class App : Application
{
public App()
{
Serve.RunNative(RunOptions.Default); // 默认 5000 端口,如果出现占用,推荐使用下面的方式
// Serve.RunNative(RunOptions.Default, Serve.IdleHost.Urls); // 随机端口
}
protected override void OnStartup(StartupEventArgs e)
{
Native.CreateInstance<MainWindow>().Show();
base.OnStartup(e);
}
}
Web
主机环境默认情况下,通过 WPF
启动 Web
主机环境总是为 Production
,但在开发阶段可能会出现配置加载错误问题,这时只需要添加 ConfigureOptions
配置即可,如:
Serve.RunNative(RunOptions.Default
.ConfigureOptions(new WebApplicationOptions
{
// Debugger.IsAttached 可判断释放为 Debug 模式
EnvironmentName = Debugger.IsAttached ? "Development" : default
}));
34.7.1.3 添加 YourProject.Web.Core
层引用
<ItemGroup>
<ProjectReference Include="..\Your.Web.Core\Furion.Web.Core.csproj" />
</ItemGroup>
34.7.1.4 拷贝 YourProject.Web.Entry
内容
如果有 YourProject.Web.Entry
启动层包含 *.json
文件、Controllers
、Views
、wwwroot
目录则拷贝到 WinForm/WPF
中
34.7.2 配置 WinForm/WPF
项目文件
双击 WinForm/WPF
项目进入 .csproj
文件编辑。
34.7.2.1 修改 Sdk
属性
将 Sdk="Microsoft.NET.Sdk"
修改为 Sdk="Microsoft.NET.Sdk.Razor"
<Project Sdk="Microsoft.NET.Sdk.Razor">
34.7.2.2 添加 MVC/Razor
支持
WinForm
<Project Sdk="Microsoft.NET.Sdk.Razor">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net7.0-windows</TargetFramework>
<Nullable>enable</Nullable>
<UseWindowsForms>true</UseWindowsForms>
<ImplicitUsings>enable</ImplicitUsings>
<SatelliteResourceLanguages>en-US</SatelliteResourceLanguages>
<PublishReadyToRunComposite>true</PublishReadyToRunComposite>
<AddRazorSupportForMvc>true</AddRazorSupportForMvc>
</PropertyGroup>
</Project>
WPF
<Project Sdk="Microsoft.NET.Sdk.Razor">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net7.0-windows</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<UseWPF>true</UseWPF>
<SatelliteResourceLanguages>en-US</SatelliteResourceLanguages>
<PublishReadyToRunComposite>true</PublishReadyToRunComposite>
<AddRazorSupportForMvc>true</AddRazorSupportForMvc>
</PropertyGroup>
</Project>
34.7.2.3 添加 wwwroot
静态发布配置
如果 YourProject.Web.Entry
包含 wwwroot
目录,则添加以下配置,否则跳过。
<ItemGroup>
<Content Update="wwwroot\**\*">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
34.7.2.4 完整配置
完整的配置大概如下:
WinForm
<Project Sdk="Microsoft.NET.Sdk.Razor">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net7.0-windows</TargetFramework>
<Nullable>enable</Nullable>
<UseWindowsForms>true</UseWindowsForms>
<ImplicitUsings>enable</ImplicitUsings>
<SatelliteResourceLanguages>en-US</SatelliteResourceLanguages>
<PublishReadyToRunComposite>true</PublishReadyToRunComposite>
<AddRazorSupportForMvc>true</AddRazorSupportForMvc>
</PropertyGroup>
<ItemGroup>
<Content Update="wwwroot\**\*">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Furion.Web.Core\Furion.Web.Core.csproj" />
</ItemGroup>
</Project>
WPF
<Project Sdk="Microsoft.NET.Sdk.Razor">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net7.0-windows</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<UseWPF>true</UseWPF>
<SatelliteResourceLanguages>en-US</SatelliteResourceLanguages>
<PublishReadyToRunComposite>true</PublishReadyToRunComposite>
<AddRazorSupportForMvc>true</AddRazorSupportForMvc>
</PropertyGroup>
<ItemGroup>
<Content Update="wwwroot\**\*">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Furion.Web.Core\Furion.Web.Core.csproj" />
</ItemGroup>
</Project>
37.7.3 嵌入 WebView2
我们可以在 WinForm/WinForm
层添加 Microsoft.Web.WebView2
包,然后在窗口中添加 WebView2
组件,实现类似前端 Electron.js
混合开发。
37.7.3.1 添加 WebView2
拓展
dotnet add package Microsoft.Web.WebView2
Microsoft.Web.WebView2 v1.0.1722.32
版本存在很严重问题(微软错误更新),所以避免安装该版本。
37.7.3.2 添加 WebView2
控件并填充窗口
WinForm
using Microsoft.AspNetCore.Hosting.Server;
using Microsoft.Extensions.Hosting;
namespace WinFormsApp1;
public partial class Form1 : Form
{
public Form1(IServer server) // 注入 IServer 服务,获取 Web 启动地址/端口
{
InitializeComponent();
webview.Dock = DockStyle.Fill;
webview.Source = new Uri(server.GetServerAddress());
}
}
WPF
<Wpf:WebView2 Name="webview" />
using Microsoft.AspNetCore.Hosting.Server;
using Microsoft.Extensions.Hosting;
using System.Windows;
namespace WpfApp1;
public partial class MainWindow : Window
{
public MainWindow(IServer server) // 注入 IServer 服务,获取 Web 启动地址/端口
{
InitializeComponent();
webview.Source = new Uri(server.GetServerAddress());
}
}
34.7.3.3 预览效果
相关技术文档:
- https://learn.microsoft.com/zh-cn/microsoft-edge/webview2/get-started/winforms
- https://learn.microsoft.com/zh-cn/microsoft-edge/webview2/get-started/wpf
34.7.4 发布 WinForm/WPF
34.7.4.1 启动层添加 SingleFilePublish
通常桌面软件都是发布为不依赖环境(独立发布),所以在启动层添加 SingleFilePublish.cs
文件编辑。
详细教程可查看 【34.5 单文件发布】
using Furion;
using System.Reflection;
namespace WinFormsApp1;
public class SingleFilePublish : ISingleFilePublish
{
public Assembly[] IncludeAssemblies()
{
return Array.Empty<Assembly>();
}
public string[] IncludeAssemblyNames()
{
return new[]
{
"Furion.Application",
"Furion.Core",
"Furion.EntityFramework.Core",
"Furion.Web.Core"
};
}
}
34.7.4.2 发布配置
发布可参考以下配置即可。
相关技术文档:
34.7.5 打包成 exe
或 msi
可参考以下文档:
https://blog.csdn.net/xfy18317776108/article/details/122343091
34.7.6 反馈与建议
给 Furion 提 Issue。