所以我知道如果你将一个变量分配给像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
并将其分配给变量?
答案 0 :(得分:1)
你的答案中的代码会创建一个未分配给变量的引用,并且会被卡住。
您可以通过为每个COM对象调用GC.Collect
然后GC.WaitForPendingFinalizers
而不是Marshal.ReleaseComObject
来清除此问题。
这比分配每个COM对象更好,然后在完成后释放它。