非托管COM对象引用上的垃圾回收

时间:2019-04-29 11:44:10

标签: c# com com-interop

我正在一个项目中引用一个COM C ++ dll。该dll中的类为嵌套形式,可创建层次结构

示例

 Cats-->
    Cat1-->
      --> Ears
         --> Ear1
         --> Ear2
    Cat2-->
      --> Ears
         --> Ear1
         --> Ear2

猫和耳朵是集合,所以在我的情况下,我正在创建哺乳动物类的对象:

Mammals objMammals= new Mammals();
objMammals.Cats.Add(); // Adds a cat object with default values

然后您可以添加Ears等等,一切正常。

但是当您使用反射尝试相同的事情时,就会出现问题。


int MammalsId = (int)objMammals.GetType().InvokeMember("FindById", System.Reflection.BindingFlags.InvokeMethod, null,objMammals, new object{0});// returns the Mammals Object Id from hierarchy

object CatsObject = (object)objMammals.GetType().InvokeMember("Cats", System.Reflection.BindingFlags.GetProperty, null,objMammals, new object{1});

以上行工作正常,但是一旦在最后两行之间调用GC.Collect(),objMammals.GetType()将变为__ComObject(不包含Cats),并且将开始抛出运行时异常。

Dll参考是孤立的,我可以看到生成的Manifest文件看起来正确。我已经尝试注册了Dll和Interop,但是也没有运气,如果有的话,在GC出现之前我如何创建Cats对象或Ears对象的任何引用,那么它就可以了。

我希望对象始终包含其实际类型,因此我可以根据需要使用反射。

0 个答案:

没有答案