我试图从我的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);
答案 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#无法找出实际的数据类型,从而做出最准确的猜测。