【问题标题】:Ref param returning array of unknown size. How to handle?参考参数返回未知大小的数组。如何处理?
【发布时间】:2012-06-28 22:48:29
【问题描述】:

COM 组件公开了一个 API,该 API 需要一个对象类型的 ref 参数。根据此 API 的文档,它将用值数组填充 ref 对象。现在我的问题在于 prod env 我无法预测我将返回的元素数量。

以下代码将起作用。

     COMClass objCOM = new COMClass ();
     object colOfInts= new int[10]; // What if I don't know the following will return array of size 10?
     int errorcode = objCOM.FillThisIn(ref colOfInts);

但是如果我不知道 API 在 ref 中返回的数组的大小。

在这里更新

        object colOfInts = null;
        int errorcode = objCOM .FillThisIn(ref colOfInts);

现在当我检查类型时,我得到 System.Int32[*]

基本上我需要遍历这个数组并检查元素是否存在

【问题讨论】:

  • 是 COM 端期待 SAFEARRAY 还是标准 int[]?
  • 如果 API 要将值填充到您的结构中,它必须有办法让您知道结构的预期大小是多少。如果内存是在 API 端分配的,则完全不需要关心。
  • 如果数组是从 API 调用内部返回的,为什么需要在代码端分配内存?
  • @MichaelEdenfield COM 需要一个对象类型而不是数组
  • 或许可以在此处粘贴 API 文档中的相关部分,以便我们更好地为您提供帮助?

标签: c# .net arrays com ref


【解决方案1】:

您将返回一个下限不是 0 的数组。这在 COM 互操作中并不少见,下一个可能的选择是 1。您不必复制它,您可以使用 Array.GetValue( )。 Array.GetLowerBound() 告诉你从哪里开始,Array.GetLength() 或 Array.GetUpperBound() 告诉你走多远。

【讨论】:

    【解决方案2】:

    最后我得到了一些解决方案。忘了说 erroCode 会有数组的大小。

            int[] test = new int[errorCode];            
            Buffer.BlockCopy((System.Array)colOfInts, 0, test, 0, errorCode * sizeof(int));
    

    【讨论】:

      【解决方案3】:

      如果您要返回一个 System.Int32 数组,您可能只需要转换:

          object colOfInts = null; 
          int errorcode = objCOM .FillThisIn(ref colOfInts); 
      
          int[] arrayOfInts = (int[]) colOfInts;
      

      那么arrayOfInts.Length就会有数组中的元素个数。

      【讨论】:

      • 不,您不能将 int[*] 转换为 int[]。
      • @HansPassant,正是我无法将 Int[*] 转换为 Int[]
      猜你喜欢
      • 2019-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-24
      • 1970-01-01
      • 1970-01-01
      • 2022-01-22
      • 2022-01-22
      相关资源
      最近更新 更多