将语句转换为 COM 对象
Casting Statement as COM Object
所以我知道如果您将变量分配给像 Matrix mtx = form.Items.Item("mtx").Specific;
这样的 COM 对象,它需要用 Marshal.ReleaseComObject(mtx);
释放
但是如果我将它转换为像 ((Matrix)form.Items.Item("mtx").Specific).AddRow(1);
这样的 COM 对象会怎样呢?
现在我没有变量引用。这会被释放吗?是否在内存中创建了一个引用,现在它一直停留在那里直到应用程序被终止?
采用这种扩展方法:
public static T BindControlAs<T>(this BaseFormHandler handler, string itemId) where T : class
{
if (!(handler.form.Items.Item(itemId).Specific is T control))
throw new InvalidOperationException($"{typeof(T)} failed to bind {itemId}");
return control;
}
此扩展方法仅用于我的窗体 COM 对象。现在我可以在我的表格上执行以下操作
this.BindControlAs<Matrix>("mtx").AddRow(1);
同样,我没有将其分配给变量以允许我 Marshal.ReleaseComObject
。
所以我的问题是强制转换或扩展方法是否会创建我的 COM 对象的新实例并且永远不会被释放而只是位于内存中,或者它是否会在语句执行后被删除?
如果它永远不会被释放,有没有办法确保它没有 Marshal.ReleaseComObject
并将其分配给变量?
您答案中的代码会创建一个未分配给变量的引用,并且会被卡住。
您可以通过调用 GC.Collect
然后为每个 COM 对象调用 GC.WaitForPendingFinalizers
而不是 Marshal.ReleaseComObject
来清理它。
这比分配每个 COM 对象然后在完成后释放它要好。
所以我知道如果您将变量分配给像 Matrix mtx = form.Items.Item("mtx").Specific;
这样的 COM 对象,它需要用 Marshal.ReleaseComObject(mtx);
但是如果我将它转换为像 ((Matrix)form.Items.Item("mtx").Specific).AddRow(1);
这样的 COM 对象会怎样呢?
现在我没有变量引用。这会被释放吗?是否在内存中创建了一个引用,现在它一直停留在那里直到应用程序被终止?
采用这种扩展方法:
public static T BindControlAs<T>(this BaseFormHandler handler, string itemId) where T : class
{
if (!(handler.form.Items.Item(itemId).Specific is T control))
throw new InvalidOperationException($"{typeof(T)} failed to bind {itemId}");
return control;
}
此扩展方法仅用于我的窗体 COM 对象。现在我可以在我的表格上执行以下操作
this.BindControlAs<Matrix>("mtx").AddRow(1);
同样,我没有将其分配给变量以允许我 Marshal.ReleaseComObject
。
所以我的问题是强制转换或扩展方法是否会创建我的 COM 对象的新实例并且永远不会被释放而只是位于内存中,或者它是否会在语句执行后被删除?
如果它永远不会被释放,有没有办法确保它没有 Marshal.ReleaseComObject
并将其分配给变量?
您答案中的代码会创建一个未分配给变量的引用,并且会被卡住。
您可以通过调用 GC.Collect
然后为每个 COM 对象调用 GC.WaitForPendingFinalizers
而不是 Marshal.ReleaseComObject
来清理它。
这比分配每个 COM 对象然后在完成后释放它要好。