Вопрос

Можно ли увеличить ссылку 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 звонки.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top