C# 編譯產出的是托管代碼,而傳統 ActiveX 組件是非托管代碼。兩者本質不同:.NET 追求「Write Once, Run Anywhere」跨平台,ActiveX 綁定 Windows 平台。VS.NET 提供的「引用 ActiveX」實際是通過互操作 (Interop) 生成運行時可調用包裝器 (RCW),將非托管 COM 組件包裝為托管類庫。同理,C# 創建的組件若需在 Web 頁面以 `
在 `MyControl.cs [設計]` 視圖中,從工具箱拖入:
切換到代碼視圖,替換 `InitializeComponent` 為設計器生成的精確佈局代碼 (見原文),確保控件位置、大小正確。
// 1. 定義 COM 可見接口 (供外部調用)
[ComVisible(true)]
[InterfaceType(ComInterfaceType.InterfaceIsDual)] // 雙重接口:支持早綁/晚綁
public interface IAxMyControl
{
string UserText { get; set; }
}
// 2. 控件類實現接口,標記 COM 可見
[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)] // 不自動生成類接口,僅暴露顯式接口
[ProgId("ActiveXDotNet.MyControl")] // 指定 ProgID,供 Web 頁面 classid 使用
public class MyControl : UserControl, IAxMyControl
{
private string _userText = "";
// 實現接口屬性
public string UserText
{
get => _userText;
set
{
_userText = value;
// 同步更新 UI
if (txtUserText != null) txtUserText.Text = value;
}
}
// 構造函數、Dispose、InitializeComponent 等保持不變...
}
| 屬性 | 作用 |
|---|---|
| `[ComVisible(true)]` | 使類型對 COM 可見 (默認程序集 ComVisible=false 需在 AssemblyInfo.cs 開啟) |
| `[InterfaceType(ComInterfaceType.InterfaceIsDual)]` | 生成雙重接口 (vtable + IDispatch),支持 VB Script/JavaScript 晚綁調用 |
| `[ClassInterface(ClassInterfaceType.None)]` | 禁止自動生成 `_MyControl` 類接口,強制通過 `IAxMyControl` 訪問,版本控制更安全 |
| `[ProgId("...")]` | 指定友好程序標識符,Web 頁面 ` |
regasm ActiveXDotNet.dll /tlb /codebase<html>
<body>
<hr>
<object id="MyControl1"
classid="clsid:YOUR_GUID_HERE"
width="288" height="72">
</object>
<!-- 或使用 ProgID: classid="ActiveXDotNet.MyControl" -->
<form name="frm">
<input type="text" name="txt" value="請輸入數據:">
<input type="button" value="確定" onclick="DOScript()">
</form>
<hr>
<script language="JavaScript">
function DOScript() {
// JavaScript 調用 COM 組件屬性
MyControl1.UserText = frm.txt.value;
}
</script>
</body>
</html>
本文演示了 C# 創建 COM 可見 Windows Forms 控件的完整流程:定義接口 → 實現控件 → 添加 COM 互操作屬性 → 編譯 → `regasm` 註冊 → Web 頁面 `