Вопрос
Можно ли увеличить ссылку 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
}
Тип ComObject будет варьироваться (вот почему это объект)
Решение
Есть метод Marshal.addref (), неверный отсчет ссылок, хотя. Я почти уверен, что увеличение количества RCW напрямую невозможно. Выкопайте себя из глубокой дыры, в которой вы находитесь, и исправьте старый код.
Другие советы
Там является Способ, счет 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
звонки.
Для дальнейшего чтения см. Сообщение в блоге на эту тему Я написал.