ソフトキーボードコンポーネントが配置されたフォームのインスタンスを大量に生成すると例外が発生する場合がある

文書番号 : 39190     文書種別 : 不具合     登録日 : 2015/11/26     最終更新日 : 2016/11/25
文書を印刷する
対象製品
InputMan for Windows Forms 8.0J
状況
修正済み
詳細
ソフトキーボードコンポーネントが配置されたフォームのインスタンスを生成すると、このフォームを閉じてもメモリが解放されません。
そのため、フォームのインスタンス生成を繰り返すと例外が発生します。
回避方法
この問題はService Pack 2(v8.0.2016.1125)で修正されました。
不具合を修正した最新のサービスパックは、アップデートページ からダウンロードできます。

※既存のプロジェクトでは、Service Pack 2を使用してソフトキーボードコンポーネントをフォームに貼り直す必要があります。

Service Pack 2より前のバージョンでは次の方法で回避可能です。

ソフトキーボードコンポーネントが配置されたフォームのDisposeメソッドに以下の処理を追加することで回避可能です。

[Visual Basic]
【*.Designer.vbファイル】
<System.Diagnostics.DebuggerNonUserCode()> _
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
    Try
        If disposing AndAlso components IsNot Nothing Then
            components.Dispose()
        End If

        ' 回避コード1
        Form1.DisposeSoftKeyboardForm(Me.GcSoftKeyboard1)
    Finally
        MyBase.Dispose(disposing)
    End Try
End Sub

【*.vbファイル】
' 回避コード2
Friend Shared Sub DisposeSoftKeyboardForm(softKeyboard As GrapeCity.Win.Editors.GcSoftKeyboard)
    Dim fieldInfo As System.Reflection.FieldInfo = softKeyboard.GetType().GetField("_keyboard", Reflection.BindingFlags.Instance Or Reflection.BindingFlags.NonPublic)
    If fieldInfo Is Nothing Then
        Return
    End If

    Dim keyboardForm As Form = TryCast(fieldInfo.GetValue(softKeyboard), Form)
    If keyboardForm Is Nothing Then
        Return
    End If

    Dim propertyInfo As System.Reflection.PropertyInfo = keyboardForm.GetType().GetProperty("OwnerControl")
    If Not propertyInfo Is Nothing Then
        propertyInfo.SetValue(keyboardForm, Nothing, Nothing)
    End If

    keyboardForm.Dispose()
    softKeyboard.Dispose()
End Sub

[C#]
【*.Designer.csファイル】
protected override void Dispose(bool disposing)
{
    if (disposing && (components != null))
    {
        components.Dispose();
    }

    // 回避コード1
    Form1.DisposeSoftKeyboardForm(gcSoftKeyboard1);
    base.Dispose(disposing);
}

【*.csファイル】
// 回避コード2
internal static void DisposeSoftKeyboardForm(GrapeCity.Win.Editors.GcSoftKeyboard softKeyboard)
{
    System.Reflection.FieldInfo fieldinfo = softKeyboard.GetType().GetField("_keyboard", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
    if (fieldinfo == null)
    {
        return;
    }

    Form keyboardForm = fieldinfo.GetValue(softKeyboard) as Form;
    if (keyboardForm == null)
    {
        return;
    }

    System.Reflection.PropertyInfo propertyInfo = keyboardForm.GetType().GetProperty("OwnerControl");
    if (propertyInfo == null)
    {
        propertyInfo.SetValue(keyboardForm, null, null);
    }

    keyboardForm.Dispose();
    softKeyboard.Dispose();
}