【问题标题】:How do I copy from an array<unsigned short> to an unsigned short[] in C CLI?如何在 C CLI 中从数组<unsigned short> 复制到 unsigned short[]?
【发布时间】:2013-11-11 21:56:32
【问题描述】:

我正在为 C API 开发 C++ CLI 包装器。 C API 有一个结构,其中包含一个由四个无符号 short 组成的数组和一个由四个 int 组成的数组。所以我创建了一个类似的类供 C# 代码调用包装函数时使用。

// C Structure
typedef struct c_Struct_
{
  unsigned short   uShorts[4];
  int     ints[4];
} c_Struct;


// C++ CLI Class
public ref class CliClass
{
public:
  property array<unsigned short>^ UnsignedShorts
  {
    array<unsigned short>^ get()
    {
      return _unsignedShorts;
    }
  }
  property array<int>^ Ints
  {
    array<int>^ get()
    {
      return _ints;
    }
  }

  CliClass(array<unsigned short>^ us, array<int> i)
  {
    _unsignedShorts = us;
    _ints = i;
  }
private:
  array<unsigned short>^ _unsignedShorts;
  array<int>^ _ints;
}

现在我们来回答我的问题。我在 CLI 类中添加了一个内部方法来创建一个结构:

internal:
  c_Struct ToStruct()
  {
    c_Struct results;
    results.uShorts[0] = UnsignedShorts[0];
    results.uShorts[1] = UnsignedShorts[1];
    results.uShorts[2] = UnsignedShorts[2];
    results.uShorts[3] = UnsignedShorts[3];
    results.ints[0] = Ints[0];
    results.ints[1] = Ints[1];
    results.ints[2] = Ints[2];
    results.ints[3] = Ints[3];
    return results;
  }

但我收到错误:IntelliSense:不能将“System::Object ^”类型的值分配给每个分配的“unsigned short”类型的实体。正确的语法是什么?

【问题讨论】:

  • 你试过取消引用句柄吗?
  • 您好像忘记在此处添加^CliClass(array&lt;unsigned short&gt;^ us, array&lt;int&gt; i)(第二个参数)

标签: c# c++ c arrays


【解决方案1】:

先拆箱引用类型,试试这个:

results.uShorts[0] = (unsigned short)UnsignedShorts[0];

【讨论】:

  • so array 在 C++ CLI 中自动装箱,但需要强制转换才能取消装箱?好的,我会试着记住这一点。
  • 根本没有装箱发生。强制转换可以有效地欺骗 IntelliSense 解析器。
  • @HansPassant 感谢您的解释。还要感谢您在 MSDN 论坛上作为 nobugz 提供的帮助。 :)
【解决方案2】:

代码是正确的,你会看到你的程序编译得很好。没有任何东西被装箱。这是 IntelliSense 解析器中的一个错误。一个相当奇怪的,很难想象它是如何摸索的。并非完全不常见,解析器是由另一家公司制造的。 Edison Design Group,以编写唯一能够正确实现 C++03 标准的编译器而闻名。不过,C++/CLI 让他们胃口大开。

两种基本的解决方法,您可以使用字段而不是属性:

   c_Struct ToStruct() {
        c_Struct results;
        results.uShorts[0] = _unsignedShorts[0];
        // etc...
   }

但这并不能解决您在使用该类的代码时遇到的问题。您可以将它们设为索引属性:

property unsigned short UnsignedShorts[int]
{
    unsigned short get(int index) {
        return _unsignedShorts[index];
    }
}
// Same for the Ints property.

【讨论】:

    【解决方案3】:

    另一种解决方法是先分配给一个临时局部变量。

    array<int> ^temp = ArrayOfIntsProperty;
    int j = temp[0];
    

    这只影响属性 - 返回托管数组的函数似乎在调用被索引时按预期工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-10
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      相关资源
      最近更新 更多