2

我有一个用 Visual Fox Pro 9.0 编写的 COM 对象。它有以下程序:

    PROCEDURE GetArray(m.vcArrayName as String) as array
RETURN @&vcArrayName

COM 对象在使用 C# 的 VS2010 项目中被引用。C#中过程的签名是:

object GetArray(string vcArrayName);

调试时我可以看到返回值是 {object[1..1]} 而类型是对象 {object[]}。展开变量,我可以看到它是一个以 1 为基数的数组,其中一个元素是一个空字符串 ("");

但是,我不能将此值转换为 object[]。我总是收到带有挪威语消息的 InvalidCastException,说我无法将 Object[*] 转换为 Object[]。

奇怪的是,如果 COM 对象返回一个二维数组,我可以毫无问题地将其转换为 object[,]。我觉得很奇怪,二维比一维更容易处理!

我想回答的问题是:

这个 Object[*] 业务是什么?谁能告诉我这是否是挪威异常消息中的错误翻译,或者 Object[*] 是否是我没听说过的某种晦涩的 C# 语法?

4

2 回答 2

5

您将得到一个维度为 1 而不是向量的多维数组。C# 语言不允许您声明这样的数组。您可以使用 Array 类引用返回值,该类允许使用类似于以下的代码进行转换:

public static object[] ConvertFoxArray(Array arr) {
  if (arr.Rank != 1) throw new ArgumentException();
  object[] retval = new object[arr.GetLength(0)];
  for (int ix = arr.GetLowerBound(0); ix <= arr.GetUpperBound(0); ++ix)
    retval[ix - arr.GetLowerBound(0)] = arr.GetValue(ix);
  return retval;
}
于 2010-04-19T11:52:51.443 回答
4

object[]是 CLI 术语中的向量;这些必须是基于 0 和 1 维的。object[*]是一个恰好是一维的数组,甚至可能(尽管不是您的情况)甚至是从 0 开始的。但它不是向量。

而不是强制转换,您将不得不将数据复制到object[]. 我在这里犯了同样的错误

您应该能够使用CopyTo

array.CopyTo(vector, 0);

(哪里array是,object[*]哪里vectorobject[]

于 2010-04-19T11:32:46.170 回答