我正在尝试从我的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似乎正在被截断,并被转换为整数而不是小数。
我的问题是:有没有办法明确地告诉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);发布于 2014-04-16 05:38:12
我找到了我自己问题的答案,我使用的COM函数返回一个变量数组,C#天生就会尝试将变量的值转换为与其最接近的数据类型。
示例:下面是数组元素和C#可识别的相应类型的示例
Element# value C#将其识别为0 1 int 1 34 INT 2 24/1/2013 dateTime 3 1/1/2013 DateTime 4 1 INT (由于此no没有小数部分,C#认为它是一个整数)5 2.63十进制(识别为小数,因为这在小数点之后有一个值)
正如您在上面针对元素#4和元素#5所看到的,C#根据值将它们转换为不同的数据类型。这是非常有意义的(事后看来),因为C#无法找出实际的数据类型,因此无法做出最准确的猜测。
https://stackoverflow.com/questions/23082238
复制相似问题