我在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接口?
答案 0 :(得分:0)
可能是COM对象读取上一次迭代的值吗?
是的。 COM自动化中没有等效的 out ,除了方法的返回值。你如何最终使用 out 而不是 ref 是相当神秘的。可能只是IDL中用于声明COM接口的错误。唯一与COM自动化兼容的IDL属性是[in],[in,out]和[out,retval]。
仍然不应该是一个问题,COM服务器可以调用VariantClear()来重置变体。似乎它也不想这样做。您无法修复该代码,自己重置该值肯定是一个足够好的解决方法。