winforms API项目是否可以引用和示例化引用System.Windows.Forms控件的Windows窗体类库?

c6ubokkw  于 2023-02-24  发布在  Windows
关注(0)|答案(1)|浏览(224)

我正在将一个遗留的.NET 4.x Web API和类库移植到.NET 7。该类库为Windows和Web环境服务,并具有公共类,这些公共类具有使用Windows窗体控件和Microsoft.AspNetCore.Http.HttpContext项的函数重载。
我将类库升级为Windows窗体类库项目模板,然后添加Microsoft.AspNetCore.Routing来访问Web内容。
当在Web API中添加对类库的引用时,它起作用.
然而,当我尝试示例化类库时,我得到了如下错误:
未能加载文件或程序集“System.Windows.Forms,版本=7.0.0.0,区域性=非特定,公钥标记=b77a5c561934e
是否不可能从Web项目访问完整的.NET核心(Windows窗体)环境?
我可以引用DLL,但是当我示例化类时,我得到了那个错误。

efzxgjgh

efzxgjgh1#

您可以在ASP.NET Web应用程序中引用WinForms类库,但我无法轻松地想象在ASP.NET Web应用程序中使用WinForms控件的有效使用场景。但关键是您需要确保两个项目都使用<TargetFramework>net7.0-windows</TargetFramework>目标框架。

    • 示例**

在下面的例子中,在web应用程序中,我将示例化类库中的一个自定义控件,然后我只使用自定义控件的DrawToBitmap方法来创建一个图像,稍后我将在网页中显示该图像。
下面是一个分步示例:
1.创建一个ASP.NET核心Web应用程序项目,选择. NET 7,并将其命名为Net7WebApplication。
1.编辑项目文件,并将目标框架更改为<TargetFramework>net7.0-windows</TargetFramework>。(您可以在项目属性页中执行相同的操作)
1.添加一个新的WinForms控件库. NET项目,选择. NET 7,并将其命名为Net7WinFormsLibrary。
1.将class1.cs修改为以下代码:

namespace Net7WinFormsLibrary
{
    public class MyControl : Control
    {
        public MyControl()
        {
            this.Size = new Size(200, 200);
        }
        protected override void OnPaint(PaintEventArgs e)
        {
            e.Graphics.Clear(Color.Red);
            TextRenderer.DrawText(e.Graphics, "Hello, World!",
                new Font("Segoe UI", 10), ClientRectangle, Color.Blue);
        }
    }
}

1.将WinForms项目的引用添加到Web项目。
1.将Index.cshtml.cs修改为以下内容:

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using System.Drawing;
using static System.Net.Mime.MediaTypeNames;

namespace Net7WebApplication.Pages
{
    public class IndexModel : PageModel
    {
        private readonly ILogger<IndexModel> _logger;

        public IndexModel(ILogger<IndexModel> logger)
        {
            _logger = logger;
        }
        public string ImageSrc { get; set; }
        public void OnGet()
        {
            var c = new Net7WinFormsLibrary.MyControl();
            using (var bm = new Bitmap(200, 200))
            {
                c.DrawToBitmap(bm, c.ClientRectangle);
                var bytes = (byte[])new ImageConverter().ConvertTo(bm, typeof(byte[]));
                ImageSrc = $"data:image/png;base64,{Convert.ToBase64String(bytes)}";
            }
        }
    }
}

1.将Index. cshtml修改为以下内容:

@page
@model IndexModel
@{
    ViewData["Title"] = "Home page";
}

<div class="text-center">
    <h1 class="display-4">Welcome</h1>
    <p>Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>

    <img src="@Model.ImageSrc" />
</div>

1.保存所有内容并运行项目。就这样!

相关问题