0

我在 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 接口不是自动生成的吗?

4

1 回答 1

0

会不会是 COM 对象读取了上一次迭代的值?

是的,它确实。除了方法的返回值之外,在 COM 自动化中没有等价的out 。你如何以out而不是ref结束是相当神秘的。可能只是用于声明 COM 接口的 IDL 中的一个错误。唯一与 COM 自动化兼容的 IDL 属性是 [in]、[in,out] 和 [out,retval]。

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

于 2012-11-14T18:03:16.247 回答