首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

VB6 MSComm 控件加載失敗?VB.NET 直接用 SerialPort 替代

     編輯:程式設計疑難解答

錯誤原因

MSComm32.ocx 是VB6 時代的 ActiveX 控件,依賴 32 位運行時、註冊表註冊、mscomm32.ocx 文件存在於 SysWOW64。VB.NET(.NET Framework)不支持直接引用 OCX,工具箱「組件」頁面加載時會嘗試包裝為 RCW(Runtime Callable Wrapper),常因缺少註冊、位數不匹配、缺少互操作程序集而報錯 could not be loaded。

現代解決方案:System.IO.Ports.SerialPort

.NET Framework 2.0+ 內置 System.IO.Ports.SerialPort 類,完全托管、無需註冊、跨平台(Windows/Linux/macOS 均可用),功能覆蓋 MSComm 99% 場景。

基礎用法對比

操作VB6 MSCommVB.NET SerialPort
打開端口MSComm1.PortOpen = Truesp.Open()
設置波特率MSComm1.Settings = "9600,N,8,1"sp.BaudRate = 9600; sp.Parity = Parity.None; sp.DataBits = 8; sp.StopBits = StopBits.One
發送數據MSComm1.Output = "AT\r\n"sp.WriteLine("AT") 或 sp.Write(bytes, 0, bytes.Length)
接收事件Private Sub MSComm1_OnComm()AddHandler sp.DataReceived, AddressOf DataReceivedHandler
關閉端口MSComm1.PortOpen = Falsesp.Close()

完整 VB.NET 範例

Imports System.IO.Ports

Public Class Form1
    Private WithEvents sp As New SerialPort()

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        sp.PortName = "COM3"
        sp.BaudRate = 9600
        sp.Parity = Parity.None
        sp.DataBits = 8
        sp.StopBits = StopBits.One
        sp.Encoding = Encoding.ASCII ' 或 UTF8
        sp.NewLine = vbCrLf
        Try
            sp.Open()
        Catch ex As Exception
            MessageBox.Show("打開失敗: " & ex.Message)
        End Try
    End Sub

    Private Sub DataReceivedHandler(sender As Object, e As SerialDataReceivedEventArgs)
        Dim data = sp.ReadExisting()
        ' 跨線程更新 UI 需 Invoke
        Me.Invoke(Sub() txtReceive.AppendText(data))
    End Sub

    Private Sub btnSend_Click(sender As Object, e As EventArgs) Handles btnSend.Click
        If sp.IsOpen Then sp.WriteLine(txtSend.Text)
    End Sub

    Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
        If sp.IsOpen Then sp.Close()
    End Sub
End Class

遷移清單

  1. 刪除工具箱 MSComm 參考,專案引用移除 AxMSCommLib、MSCommLib。
  2. 工具箱右鍵 → 「選擇項目」 → 「.NET Framework 組件」 → 勾選 System.IO.Ports(通常已默認)。
  3. 將原 MSComm 邏輯逐行映射到 SerialPort 屬性/方法/事件。
  4. 注意 DataReceived 事件在非 UI 線程觸發,更新控件必須 Control.Invoke。

特殊場景:仍需 MSComm 的極少數情況

  • 維護純 VB6 老項目無法遷移,需在 32 位系統註冊 regsvr32 mscomm32.ocx。
  • 特殊硬件廠商僅提供 OCX 封裝 SDK(極罕見),需編寫 C++/CLI 包裝層供 .NET 調用。

結論:VB.NET 串口開發請直接用 SerialPort,拒絕 MSComm,省時省力又標準。

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