首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 撰寫網頁小應用程式:用 WinForms 控制項嵌入 HTML (Object 標籤)

     編輯:關於C#

概念:C# 版 Applet

Java 早期以 Applet 闻名,透過 `` / `` 標籤將 Java 程式碼嵌入網頁。.NET 雖無原生 Applet,但可利用 **WinForms 控制項 + ``** 達到類似效果:瀏覽器載入 .dll,實例化繼承 Control 的類別,並在網頁矩形區域內渲染互動畫面。

前置條件

  • 用戶端已安裝對應版本 **.NET Framework** (如 4.8)。
  • 瀏覽器支援 ActiveX / NPAPI (舊版 IE) 或需設定 ClickOnce / .NET Core WebView2 替代方案。**現代瀏覽器已淘汰 NPAPI,本技術僅供教學/內網舊系統維護參考。**

完整範例:彈跳小球

1. 控制項類別庫


// BallGame.cs
using System;
using System.Drawing;
using System.Threading;
using System.Windows.Forms;

namespace BallGame
{
    public class BallControl : Control
    {
        private Rectangle _ball = new Rectangle(0, 0, 50, 50);
        private Thread _thread;
        private Image _buffer;
        private int _vx = 4, _vy = 6;

        public BallControl()
        {
            ClientSize = new Size(200, 300);
            BackColor = Color.Gray;
            DoubleBuffered = true; // 減少閃爍
            _thread = new Thread(Run) { IsBackground = true };
            _thread.Start();
        }

        protected override void OnPaint(PaintEventArgs e)
        {
            if (_buffer != null) e.Graphics.DrawImage(_buffer, 0, 0);
        }

        private void Run()
        {
            while (true)
            {
                _buffer = new Bitmap(ClientSize.Width, ClientSize.Height);
                using (var g = Graphics.FromImage(_buffer))
                {
                    g.FillEllipse(Brushes.Blue, _ball);
                }

                // 邊界反彈
                if (_ball.X <= 0 || _ball.Right >= ClientSize.Width) _vx = -_vx;
                if (_ball.Y <= 0 || _ball.Bottom >= ClientSize.Height) _vy = -_vy;

                _ball.X += _vx;
                _ball.Y += _vy;

                Invalidate(); // 觸發重繪
                Thread.Sleep(30);
            }
        }

        protected override void Dispose(bool disposing)
        {
            if (disposing) _thread?.Join(100);
            base.Dispose(disposing);
        }
    }
}

2. 編譯為 DLL


csc /t:library /out:BallGame.dll /r:System.dll,System.Drawing.dll,System.Windows.Forms.dll BallGame.cs

3. HTML 嵌入


<!DOCTYPE html>
<html>
<head><meta charset="utf-8" /><title>C# 彈跳球</title></head>
<body>
<h3>C# WinForms 控制項嵌入網頁</h3>
<object id="ball" classid="BallGame.dll#BallGame.BallControl" width="300" height="200" VIEWASTEXT>
  <p>無法載入控制項,請確認已安裝 .NET Framework 並使用相容瀏覽器。</p>
</object>
</body>
</html>

關鍵點總結

項目說明
基底類別必須繼承 System.Windows.Forms.Control
輸出類型Class Library (.dll),非 .exe
classid 格式檔案名.dll#命名空間.類別名 (相對/絕對路徑皆可)
尺寸同步HTML width/height 需與控制項 ClientSize 一致,否則會有縮放或裁切
執行緒UI 執行緒不可阻塞,動畫請另開 Thread/Task 並用 Invalidate() 觸發重繪
資源釋放覆寫 Dispose 停止背景執行緒,避免網頁卸載時殘留

現代替代方案 (強烈建議)

  • Blazor WebAssembly:C# 直接在瀏覽器 WASM 執行,無需外掛,支援所有現代瀏覽器。
  • WebView2 (Edge Chromium):在原生應用嵌入網頁,或以 WPF/WinForms 宿主載入 Blazor。
  • JavaScript/TypeScript + Canvas/WebGL:原生網頁技術,效能最佳、相容性最高。
  • Unity WebGL / Godot Web:遊戲導向專案首選。

安全性提醒

舊式 `` 技術要求用戶端安裝完整 .NET Framework 並啟用瀏覽器外掛,**攻擊面極大**,現代企業環境多透過群組原則封鎖。僅建議於**受控內網、舊系統維護**情境使用,新專案請採用上述現代方案。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved