【问题标题】:COM call returns int instead of decimalCOM 调用返回 int 而不是 decimal
【发布时间】:2014-04-16 05:38:12
【问题描述】:

我正在尝试从我的 C# 代码中调用旧版 COM 组件。 该方法的签名如下所示。参数 2 、 3 和 4 是参考参数。

  GetCOMData(UserId As Long, arraySummary As Variant, startDate As Variant, endDate As Variant)

有问题的位是参数 2 (arraySummary)。似乎遗留代码在参数 2 中返回了一个变体数组,并且它们都具有不同的数据类型,如下所示。

'                   Elements of arraySummary 
'                   0   -   int
'                   1   -   int 
'                   2   -   date 
'                   3   -   date
'                   4   -   decimal
'                   5   -   decimal
'                   6   -   decimal
'                   7   -   decimal

当 COM 调用完成并返回引用对象时,arraySummary 的元素 4 - 7 似乎被截断并转换为 int 而不是 decimal。

我的问题是:有没有办法明确告诉 Method.InvokeMember 我期望参数 arraySummary 的数组元素 4 - 7 的小数?

我调用 COM 对象的 C# 代码如下所示:

 var parameters = new object[4];
        ParameterModifier p = new ParameterModifier(4);
        p[1] = true;
        p[2] = true;
        p[3] = true;
        ParameterModifier[] mods = { p };
        parameters[0] = UserID;
        Type t= Type.GetTypeFromProgID("ComDLL.COMClass");
        object comObj = Activator.CreateInstance(t);
        object recordSet = comObj .InvokeMember("GetCOMData", System.Reflection.BindingFlags.InvokeMethod, null, comObj , parameters, mods, null, null);

【问题讨论】:

  • 只是为了确保:您是否检查过在 .NET 外部(例如,通过 VBA)调用时是否正常工作?
  • 不确定,但也许您可以将用户定义的类型作为第二个参数发送?在类型定义中,您可以指定每个元素的类型
  • @Heinzi:你是对的,当我测试 COM 对象时,它返回的值包含小数点后的内容,如果该值没有任何内容,则 c# 将其检测为十进制在小数点之后,c# 将其视为 int(这是正确的行为),似乎我对变体的行为感到困惑。 .NET 将根据数据将值转换为其最接近的类型,并且由于我的数据在小数点后没有任何内容,因此 C# 将其转换为 int。
  • @Pat:啊,这确实很有趣!我可以建议您将其写下来作为答案并“接受”您自己的答案吗?这样一来,您的问题就不会出现在“未回答的问题”列表中,而其他有相同问题的人也可以从您的发现中受益。

标签: c# com vb6


【解决方案1】:

我找到了我自己的问题的答案,我使用的 COM 函数返回一个变体数组,C# 固有地尝试将变体的值转换为其最接近的可能数据类型。

例如: 下面是数组元素的示例和 C# 识别的相应类型

Element# Value C# 将其识别为 0 1 整数 1 34 整数 2 24/1/2013 日期时间 3 1/1/2013 日期时间 4 1 INT(因为这个 no 没有小数部分 C# 认为它是一个 int) 5 2.63 DECIMAL(被识别为十进制,因为它在小数点后有一个值)

正如您在上面看到的元素 #4 和 5 一样,C# 根据值将它们转换为不同的数据类型。这是完全合理的(事后看来),因为 C# 无法找出实际的数据类型,因此无法做出最准确的猜测。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-15
    • 2015-03-03
    • 2016-05-28
    相关资源
    最近更新 更多