Сборка мусора по ссылкам неуправляемых объектов COM - PullRequest
0 голосов
/ 29 апреля 2019

Я работаю над проектом, в котором я ссылаюсь на один 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

и затем вы можете добавить уши и т. Д., И все работает нормально.

Но проблема возникает, когда вы пытаетесь сделать то же самое с помощью отражения.


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ссылка изолирована, и я вижу, что сгенерированный файл манифеста выглядит правильно.Я пытался зарегистрировать Dll, а также Interop, но не повезло, если как-то, как я создаю какую-либо ссылку на объект Cats или объект Ears до того, как GC входит, то это работает просто отлично.

Iхочу, чтобы объекты всегда содержали свой фактический тип, поэтому я могу использовать отражение так, как мне нужно.

...