背景:我正在开发一个涉及 WinForms 应用程序的项目。客户端希望公开一个仅限本地的 HTTP 服务器,以允许其他应用程序通过 REST API(或类似 API)触发正在运行的 WinForms 应用程序实例上的功能。首选是使用 ASP.NET Core 实现上述 API。
因此,我的问题是:如何构建一个项目,以便在同一进程中同时拥有 ASP.NET Core API 和 WinForms GUI?有什么我必须警惕的陷阱吗?
在 Windows 窗体应用程序中托管 ASP.NET CORE API 并与窗体交互
以下是有关如何创建项目以在 Windows 窗体应用程序中托管 ASP.NET CORE API 并与窗体执行一些交互的基本分步示例。
为此,请按照下列步骤操作:
-
创建一个 Windows 窗体应用程序并将其命名MyWinFormsApp
-
Open Form1
在设计模式下并删除TextBox
on it.
-
改变Modifiers
的财产textBox1
在设计师中Public
并保存它。
-
Install Microsoft.AspNetCore.Mvc
package
-
Install Microsoft.AspNetCore
package
-
创建一个Startup.cs
将以下代码复制到项目根目录下:
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
namespace MyWinFormsApp
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseMvc();
}
}
}
-
将以下代码复制到Program.cs
:
using System;
using System.Threading;
using System.Windows.Forms;
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
namespace MyWinFormsApp
{
public class Program
{
public static Form1 MainForm { get; private set; }
[STAThread]
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().RunAsync();
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
MainForm = new Form1();
Application.Run(MainForm);
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>();
}
}
-
创建一个名为的文件夹Controllers
在项目的根目录中。
-
Create ValuesController.cs
in the Controllers
文件夹并将以下代码复制到文件中:
using System;
using Microsoft.AspNetCore.Mvc;
namespace MyWinFormsApp.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
[HttpGet]
public ActionResult<string> Get()
{
string text = "";
Program.MainForm.Invoke(new Action(() =>
{
text = Program.MainForm.textBox1.Text;
}));
return text;
}
[HttpGet("{id}")]
public ActionResult Get(string id)
{
Program.MainForm.Invoke(new Action(() =>
{
Program.MainForm.textBox1.Text = id;
}));
return Ok();
}
}
}
-
运行应用程序。
-
在里面输入“嗨”textBox1
-
打开浏览器并浏览 http://localhost:5000/api/values → 你会看到hi
作为回应。
-
http://localhost:5000/api/values/bye → 你会看到bye
in textBox1
进一步阅读
您也可能对。。。有兴趣如何在 Windows 窗体 (WinForms) 中使用依赖注入 (DI) https://stackoverflow.com/a/70476716/3110834
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)