C# 动态COM对象是否被视为托管资源?
我的类中有一个C# 动态COM对象是否被视为托管资源?,c#,c#-4.0,com,idisposable,C#,C# 4.0,Com,Idisposable,我的类中有一个dynamicCOM对象作为私有字段。我不确定它是否被认为是托管资源(GC清理它),或者不 在实现IDispose时,我应该将其清理为托管资源(仅当显式调用Dispose()时)还是本机资源(当从终结器调用Dispose(false)时) 1 COM是一个组件,所以它完全取决于他所做的。如果它满足以下功能 打开文件 开放网络连接 非托管内存 在XNA中:顶点缓冲区、索引缓冲区、纹理等 =>是的,它是非托管资源 垃圾收集器没有关于此资源的信息,因此清理是为用户准备的 2对于清理
dynamic
COM对象作为私有字段。我不确定它是否被认为是托管资源(GC清理它),或者不
在实现IDispose时,我应该将其清理为托管资源(仅当显式调用Dispose()时)还是本机资源(当从终结器调用Dispose(false)时)
1 COM是一个组件,所以它完全取决于他所做的。如果它满足以下功能
- 打开文件
- 开放网络连接
- 非托管内存
- 在XNA中:顶点缓冲区、索引缓冲区、纹理等
Dispose
方法(或使用bloc;在处理结束时调用Dispose)。它是一个托管资源(基本上是一个运行时可调用的包装器),您应该这样清理它:
每个RCW在其包装的COM对象上维护一个接口指针缓存,并在不再需要RCW时释放其对COM对象的引用。运行时对RCW执行垃圾收集
也就是说,RCW是封装非托管COM引用的托管资源
另外,如果从应用程序中多个位置的多个线程中使用COM对象,则释放COM对象可能是危险的,如中所述
如果您正在以限定范围的单线程方式使用COM对象,那么在使用完该对象后,您可以安全地调用该对象上的ReleaseComObject:希望这就是您的情况。是的,GC会清理它。它没有实现IDisposable,因此没有任何可处理的内容。在谷歌搜索
后到达这里的是Activator.CreateInstance托管还是非托管的。。。我一直在找,因为我的工作。
private dynamic _comConnector = null;
_comConnector = Activator.CreateInstance(Type.GetTypeFromProgID("SomeProgId"));
private void Dispose(bool disposing)
{
if (disposing)
{
// Free managed resources //
// --> Should I call Marshal.FinalReleaseComObject(_comConnector) here?
}
// Free unmanaged resources //
// --> Or maybe here?
}