You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows 10更新后WinForm调用InkEdit控件内存泄漏问题求解及反馈渠道咨询

可行解决方案

方案1:手动释放非托管资源(优先尝试)

你遇到的泄漏本质是新版本Win10下mshwLatin.dll加载后未随InkEdit控件销毁自动释放,可通过重写窗体的Dispose方法强制释放所有相关资源,修改后的代码如下:

Imports Microsoft.Ink
Imports System.Runtime.InteropServices

Public Class Form2
    Dim inkfield As New InkEdit
    Dim inkfield2 As New InkEdit
    Dim inkfield3 As New InkEdit
    Dim inkfield4 As New InkEdit
    Dim inkfield5 As New InkEdit

    ' P/Invoke声明,用于释放加载的dll
    <DllImport("kernel32.dll", SetLastError:=True)>
    Private Shared Function FreeLibrary(hModule As IntPtr) As Boolean
    End Function
    <DllImport("kernel32.dll", SetLastError:=True, CharSet:=CharSet.Auto)>
    Private Shared Function GetModuleHandle(lpModuleName As String) As IntPtr
    End Function

    Public Sub New()
        InitializeComponent()
        Me.Controls.Add(inkfield)
        Me.Controls.Add(inkfield2)
        Me.Controls.Add(inkfield3)
        Me.Controls.Add(inkfield4)
        Me.Controls.Add(inkfield5)
        inkfield.Location = New Point(10, 10)
        inkfield2.Location = New Point(10, 40)
        inkfield3.Location = New Point(10, 70)
        inkfield4.Location = New Point(10, 100)
        inkfield5.Location = New Point(10, 150)
        inkfield.Height = 24
        inkfield2.Height = 24
        inkfield3.Height = 24
        inkfield4.Height = 24
        inkfield5.Height = 24
    End Sub

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        Me.Close()
    End Sub

    ' 重写Dispose方法,手动释放资源
    Protected Overrides Sub Dispose(disposing As Boolean)
        If disposing Then
            ' 释放所有InkEdit控件
            Dim inkControls = {inkfield, inkfield2, inkfield3, inkfield4, inkfield5}
            For Each c In inkControls
                If Not IsNothing(c) Then
                    c.Dispose()
                End If
            Next
            ' 释放mshwLatin.dll
            Dim hMod = GetModuleHandle("mshwLatin.dll")
            If hMod <> IntPtr.Zero Then
                FreeLibrary(hMod)
            End If
        End If
        MyBase.Dispose(disposing)
    End Sub
End Class

修改后重复开关窗口测试内存占用,多数情况下可解决泄漏问题。

方案2:替换老旧InkEdit控件

如果方案1无效,可迁移到新版墨迹输入控件:通过XAML Islands将UWP原生的InkCanvas控件嵌入到WinForms项目中,该控件是微软目前官方维护的墨迹输入实现,不存在该兼容性泄漏问题。

向微软反馈的最优途径

  • 按Win+F打开Windows反馈中心,分类选择「开发人员平台 > .NET 与桌面开发」,提交时附带你的复现代码、系统版本号、内存诊断报告(可通过任务管理器或VS性能诊断工具导出),普通用户提交的反馈一般会在1-2周内进入微软问题排查队列。
  • 如果你有Visual Studio付费订阅,可在VS菜单栏「帮助 > 发送反馈 > 报告问题」提交问题并关联你的订阅身份,处理优先级会远高于普通反馈。

内容的提问来源于stack exchange,提问作者Roger

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 23:36:03