将语句转换为 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 对象然后在完成后释放它要好。