TX_*_*TX_ 7 c# com idisposable c#-4.0
我有一个dynamicCOM对象作为我班级的私人领域.我不确定它是否被视为托管资源(GC清理它).
private dynamic _comConnector = null;
Run Code Online (Sandbox Code Playgroud)
...
_comConnector = Activator.CreateInstance(Type.GetTypeFromProgID("SomeProgId"));
Run Code Online (Sandbox Code Playgroud)
在实现IDispose时,我应该将其清理为托管资源(仅在显式调用Dispose()时),还是作为本机资源(从终结器调用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?
}
Run Code Online (Sandbox Code Playgroud)
它是一个托管资源(基本上是一个运行时可调用包装器),你应该这样清理它. MSDN声明:
每个RCW在它包装的COM对象上维护一个接口指针的缓存,并在不再需要RCW时释放它在COM对象上的引用.运行时在RCW上执行垃圾收集.
即RCW是一个托管非托管COM引用的托管资源.
另外,如果您在应用程序的多个位置使用多个线程,释放COM对象可能会很危险,如Chris Brumme的博客文章中所述.
如果您以作用域,单线程方式使用COM对象,则可以在完成后对该对象安全地调用ReleaseComObject:希望这是您的情况.