2011-01-07 109 views
1

我有一个本地C++应用程序需要调用一个C#库。在研究了不同的选项之后,我选择添加一个C++/CLI库作为包装来处理两者之间的直接接口。我有一个非常大的数组,我从C++传递到C#(如此之大以至于通过Marshal :: Copy进行复制是不可能的)。我一直无法解决语法问题。本地C++数组通过C++/CLI C#数组

C#函数声明:

void Computation::passInVolume(int size, short volume[]) 

C++/CLI功能:

void Wrapper::passInVolume(int size, short volume[]) 
{ 
    //this call succeeds, but does not contain my data 
    array<short>^ locArray = gcnew array<short>(size); 

    // This line produces: error C2440: 'type cast' : cannot convert from 
    // 'short []' to 'cli::array<Type> ^' 
    array<short>^ locArray2 = (array<short>^)volume; 

    // call requires array<short>^ as input type 
    Computation::passInVolume(size, locArray); 
} 

C++代码:

volImage = (short*)malloc(size*sizeof(short)); 
... 
wrapper->passInVolume(size, volImage); 

有没有办法来投这个,我只是缺少?我已经以其他方式成功完成了这个任务,从C#调用C++,过去没有任何问题(甚至是任何投射)。

回答

1

使得通过元帅:复制一个副本是出了问题

太差。 .NET数组总是在托管堆上,你无法说服.NET做其他事情。

你还有不涉及复制几个选项:

  • 重写C#代码使用指针(当然其中添加需要额外的参数,携带长度)。 C#可以使用原生分配的指针,并执行指针运算来查找剩余的元素。

  • 重写C++库以使用外部提供的缓冲区。由于C++已经使用指针,因此可以将C#数组固定到位,并将指向其内容的指针传递给本机库。

+0

我最终重构了C#使用指针。努力没有我最初想象的那么糟糕。 – Beast 2011-01-08 00:08:27