将COM对象作为参数传递给C#

时间:2010-08-29 02:01:37

标签: c# .net com

鉴于以下代码,有人可以解释为什么我可以将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 个答案:

答案 0 :(得分:3)

这与COM对象无关,它只是C#的一个规则。除非参考类型与参数类型相同,否则您无法将引用类型传递给outref参数。

否则它将允许不安全的情况,如下面的

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

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

现在,string引用引用的类型为Type的对象是错误且非常不安全的。