gpt4 book ai didi

c# - 动态 COM 对象是否被视为托管资源?

转载 作者:太空狗 更新时间:2023-10-29 20:24:51 25 4
gpt4 key购买 nike

我有一个 dynamic COM 对象作为我类(class)的私有(private)字段。我不确定它是否被视为托管资源(GC 清理它)。

private dynamic _comConnector = null;

...

_comConnector = Activator.CreateInstance(Type.GetTypeFromProgID("SomeProgId"));

在实现 IDispose 时,我应该将其清理为托管资源(仅当显式调用 Dispose() 时),还是清理为 native 资源(当 Dispose(false) 也从终结器调用时)?

private void Dispose(bool disposing)
{
if (disposing)
{
// Free managed resources //

// --> Should I call Marshal.FinalReleaseComObject(_comConnector) here?
}

// Free unmanaged resources //

// --> Or maybe here?
}

最佳答案

它是一个托管资源(基本上是一个运行时可调用包装器),您应该像这样清理它。 MSDN states that :

Each RCW maintains a cache of interface pointers on the COM object it wraps and releases its reference on the COM object when the RCW is no longer needed. The runtime performs garbage collection on the RCW.

即RCW 是包装非托管 COM 引用的托管资源。

顺便说一句,如果您在应用程序的多个位置从多个线程使用它们,释放 COM 对象可能很危险,如 this blog post from Chris Brumme 中所述。 .

如果您以范围限定的单线程方式使用 COM 对象,那么您可以在使用完该对象后安全地调用 ReleaseComObject:希望这是您的情况。

关于c# - 动态 COM 对象是否被视为托管资源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12472498/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com