ソフトキーボードコンポーネントが配置されたフォームのインスタンスを大量に生成すると例外が発生する場合がある
対象製品
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();
}
不具合を修正した最新のサービスパックは、アップデートページ からダウンロードできます。
※既存のプロジェクトでは、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();
}