COM方法从输出变量读取?

时间:2012-11-14 16:47:47

标签: c# com-interop out

我在for循环中调用一个方法来调用COM对象上的方法(Inventor 2012)。

以前的代码是:

foreach (var occ in occurrences)
{
    // [...]
    SomeMethod(occ);
    // [...]

重构时我决定内联方法调用:

foreach (var occ in occurrences)
{
    // [...]
    BOMQuantityTypeEnum quantityType;
    object quantity;
    occ.Definition.BOMQuantity.GetBaseQuantity(out quantityType, out quantity);
    if (quantityType ==
    // [...]
}

在改变别的情况下,这开始失败,抛出E_INVALIDARG。此外,它仅在第二次调用方法时失败。但是,通过将其更改为以下内容,它再次起作用:

    BOMQuantityTypeEnum quantityType = 0;
    object quantity = null;
    occ.Definition.BOMQuantity.GetBaseQuantity(out quantityType, out quantity);

为什么会发生这种情况?

编辑:

可能是COM对象读取上一次迭代的值吗?

签名在文档中(在VB中)给出:

Sub GetBaseQuantity(ByRef QuantityType As BOMQuantityTypeEnum, ByRef Quantity As [optional] VARIANT)

C#签名错了吗?是不是自动生成COM接口?

1 个答案:

答案 0 :(得分:0)

  

可能是COM对象读取上一次迭代的值吗?

是的。 COM自动化中没有等效的 out ,除了方法的返回值。你如何最终使用 out 而不是 ref 是相当神秘的。可能只是IDL中用于声明COM接口的错误。唯一与COM自动化兼容的IDL属性是[in],[in,out]和[out,retval]。

仍然不应该是一个问题,COM服务器可以调用VariantClear()来重置变体。似乎它也不想这样做。您无法修复该代码,自己重置该值肯定是一个足够好的解决方法。