【发布时间】: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:啊,这确实很有趣!我可以建议您将其写下来作为答案并“接受”您自己的答案吗?这样一来,您的问题就不会出现在“未回答的问题”列表中,而其他有相同问题的人也可以从您的发现中受益。