Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 动态COM对象是否被视为托管资源?_C#_C# 4.0_Com_Idisposable - Fatal编程技术网

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中:顶点缓冲区、索引缓冲区、纹理等

=>是的,它是非托管资源

垃圾收集器没有关于此资源的信息,因此清理是为用户准备的

2对于清理,您可以只使用
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?
}