【问题标题】:Assign VB6 Variant into an Object将 VB6 变体分配给对象
【发布时间】:2010-12-29 14:09:47
【问题描述】:

我有一个使用 C# 编译的 Dll 的 VB6 应用程序。我已经通过 COM 成功地完成了这项工作。 但我的问题是我有一个 Variant 数组,其中包含 String 和 Double 数据类型。我需要将此数组传递给我的 C# Dll,它将数组作为对象接收。 因此,我需要做的就是将 Variant 数组转换为 C#“可理解”的 Object 数组。有人知道吗?

【问题讨论】:

    标签: c# vb6 object variant


    【解决方案1】:

    这应该可以解决问题

    ArrayList a = new ArrayList(YourObjectArrayHere);
    

    【讨论】:

      【解决方案2】:

      这必须从 C# 方面直接完成;如果不是,那么您可以从 VB6 做很多事情。也就是说,默认情况下,声明如下的方法:

      void Foo(object[] a);
      

      在 VB6 中将被视为采用 Variant 的数组(或者,在 IDL 级别,为 SAFEARRAY(VARIANT))。

      如果它不适合您,那么您的 C# 声明有问题 - 请发布它们以便审核。

      【讨论】:

        【解决方案3】:

        object[] System.Runtime.InteropServices.Marshal.GetObjectsForNativeVariants(IntPtr aSrcNativeVariant, int cVars)

        你试过这个方法吗?

        object[] result;
        unsafe
        {
          pin_ptr<object> pinObj = &obj;
          result = Marshal.GetObjectsForNativeVariants(new IntPtr(pinObj), objSize);
        }
        

        我自己没有尝试过,但似乎可以解决问题。

        【讨论】:

          【解决方案4】:

          这是 C# 函数声明:

          public double[][] CalcMatching( object[][] data1, object[][] data2, long dataLen1, long dataLen2, string matchingType )
          

          这是 VB6 调用:

          result = matchingCalcObj.CalcMatching(data1, data2, dataLen1, dataLen2, Matching)
          

          其中data1data2 是Variant 的数组。

          我不认为我可以在 C# 上做很多事情,就像你们说的那样,一旦我在函数调用中遇到的错误是“无效的过程调用或参数”。 VB6 方面的任何选项?

          感谢所有回复。

          【讨论】:

            猜你喜欢
            • 2020-03-16
            • 2012-07-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-10-22
            • 2021-01-01
            • 1970-01-01
            相关资源
            最近更新 更多