COM调用返回int而不是decimal

时间:2014-04-15 11:23:37

标签: c# com vb6

我试图从我的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而不是小数。

我的问题是:有没有办法明确地告诉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);

1 个答案:

答案 0 :(得分:1)

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

Ex: 下面是数组元素的示例以及C#

识别的相应类型

元素#值C#将其识别为  0 1 INT  1 34 int  2 24/1/2013 DateTime  3 1/1/2013 dateTime  4 1 INT(因为这个没有小数部分C#认为它是一个int)  5 2.63 DECIMAL(识别为十进制,因为它在小数点后有一个值)

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