如何在C ++ / CLI </byte>中访问IEnumerable <byte>

时间:2014-08-21 16:08:45

标签: c# .net c++-cli

我在C#中定义了一个接口:

public interface ISender
{
    ReponseType SendData(PacketType packet);
}

PacketType再次看起来像这样(C#):

public struct PacketType
{
    public IEnumerable<byte> PartOne;
    public IEnumerable<byte> PartTwo;
}

我想用C ++编写这个接口的一个实现(因为在C ++库中提供了一个协议实现,在C ++中在托管代码和非托管代码之间跳转相当容易)。我创建了一个ref class并实现了足够的编译,链接和调试所需的方法:

ResponseType MySender::SendData(PacketType packet)
{
    return ResponseType::Failure;
}

现在我一直坚持要将IEnumerable转换为uint8_t *,然后才能获得他们的长度。根据IntelliSense,它们的类型为System::Collections::Generic::IEnumerable<unsigned char> ^,并且它们根本没有公共方法。

这似乎应该是显而易见的事情,所以我觉得我一定错过了一些明显的东西。

2 个答案:

答案 0 :(得分:4)

您需要的是首先将IEnumerable转换为托管数组,然后将托管数组转换为本机数组。

由于ToArray是一种扩展方法,在C ++ / CLI中,您可以将其称为静态函数:

array<unsigned char>^ a = Enumerable::ToArray<unsigned char>(PartOne);

如何将数据从托管数组复制到本机数组,您可以找到如何执行此操作here

答案 1 :(得分:2)

不确定为什么Intellisense不起作用,但你应该有一些公共方法(GetEnumerator和从object继承的方法)。您不会看到扩展方法,但您应该可以将它们称为Enumerable类中的静态方法:

int partOneCount = Enumerable::Count(packet -> PartOne);
int partTwoCount = Enumerable::Count(packet -> PartTwo);

(我可能略微关闭了C ++语法,因为我不太习惯,但你应该明白这一点 - 任何人都可以自由地纠正语法)