Адреф в COM RCW - PullRequest
       37

Адреф в COM RCW

4 голосов
/ 22 апреля 2010

Можно ли увеличить счетчик ссылок RCW на неизвестном интерфейсе? (т.е. не счетчик ссылок на базовый COM-объект)

У меня есть старый код COM-сервера

int Method1(object comobject) {
    try {
        // do something with comobject
        return 0;
    }
    finally {
        Marshal.ReleaseComObject(comobject);
    }
 }

Этот код работает нормально, но теперь мне нужно вызвать его из другого метода.

int Method2(object comobject) {
    int result = Method1(comobject);
    // Do something with combject
}

Тип комобъекта будет различаться (поэтому он является объектом)

Ответы [ 2 ]

9 голосов
/ 06 декабря 2010

Там это способ, подсчет RCW подсчитывает, сколько раз объект был маршалирован, вы можете увеличить это число, выполнив дополнительный маршал.

public static T AddRcwRef<T>(T t) 
{
    IntPtr ptr = Marshal.GetIUnknownForObject(t);
    try {
        return (T)Marshal.GetObjectForIUnknown(ptr);
    }
    finally {
         Marshal.Release(ptr); // done with the IntPtr
    }
}

Я не уверен, что рекомендовал бы использовать этот метод, вероятно, лучше попытаться избавиться от ваших ReleaseComObject вызовов.

Для дальнейшего чтения, смотрите сообщение в блоге на эту тему Я написал.

1 голос
/ 22 апреля 2010

Есть метод Marshal.AddRef (), однако неверное изменение количества ссылок. Я уверен, что увеличить счетчик RCW напрямую невозможно. Выкопайте себя из глубокой ямы и исправьте старый код.

...