Передача COM-объектов в качестве параметров в C # - PullRequest
2 голосов
/ 29 августа 2010

Учитывая следующий код, может ли кто-нибудь объяснить, почему я могу передать COM-объект в качестве параметра значения, но не в качестве ссылочного параметра?

private void TestRelease()
{
    Excel.Workbook workbook = excel.ActiveWorkbook;
    ReleaseVal(workbook);       // OK
    ReleaseRef(ref workbook);   // Fail
}

private void ReleaseVal(Object obj)
{
    if (obj != null)
    {
        Marshal.ReleaseComObject(obj);
        obj = null;
    }
}

private void ReleaseRef(ref Object obj)
{
    if (obj != null)
    {
        Marshal.ReleaseComObject(obj);
        obj = null;
    }
}

1 Ответ

3 голосов
/ 29 августа 2010

Это не имеет ничего общего с COM-объектами, это просто правило C #.Вы не можете передать ссылочный тип параметру out или ref, если только ссылка не того же типа, что и тип параметра.

В противном случае это допускает небезопасные сценарии, подобные следующим

public void Swap(ref Object value) {
  value = typeof(Object);
}

string str = "foo";
Swap(out str); // String now has an Type???

Теперь ссылка string относится к объекту с типом Type, который является неправильным и очень небезопасным.

...