我有一个dynamic
COM对象作为我班级的私有字段。我不确定它是否被视为托管资源(GC清理它),或者不是。
private dynamic _comConnector = null;
...
_comConnector = Activator.CreateInstance(Type.GetTypeFromProgID("SomeProgId"));
实现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?
}
答案 0 :(得分:6)
它是一个托管资源(基本上是一个运行时可调用包装器),你应该这样清理它。 MSDN states that:
每个RCW在它包装的COM对象上维护一个接口指针的缓存,并在不再需要RCW时释放它在COM对象上的引用。运行时在RCW上执行垃圾收集。
即。 RCW是一个托管非托管COM引用的托管资源。
顺便说一句,如果您在应用程序的多个位置使用多个线程,则释放COM对象会很危险,如this blog post from Chris Brumme中所述。
如果您使用范围内的单线程方式使用COM对象,则可以在完成后对该对象安全地调用ReleaseComObject:希望这是您的情况。
答案 1 :(得分:0)
1 COM是一个组件,所以这一切都取决于他的所作所为。如果它满足以下功能
打开文件
打开网络连接
非托管内存
在XNA中:顶点缓冲区,索引缓冲区,纹理等
=>所以是的,它是非托管资源
垃圾收集器没有关于此ressource的信息,因此clean是针对用户的
2对于清洁,您可以使用Dispose
方法(或使用bloc;在治疗结束时调用dispose)。