我正在一个项目中引用一个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对象的任何引用,那么它就可以了。
我希望对象始终包含其实际类型,因此我可以根据需要使用反射。