【问题标题】:How to pass C# array to C++ and return it back to C# with additional items?如何将 C# 数组传递给 C++ 并将其返回给 C# 以及其他项目?
【发布时间】:2011-11-29 06:54:29
【问题描述】:

我有一个使用 C++ dll 的 C# 项目。 (在视觉工作室 2010 中)

我必须将一个 int 数组从 C# 代码传递给 C++ 函数,C++ 函数将在数组中添加少量元素,当控制权返回到 C# 代码时,C# 代码也会在同一个数组中添加元素。

最初我在 C# 代码中声明了一个数组(大小为 10000),并且 C++ 代码能够添​​加元素(因为它只是一个 int 数组,内存分配是相同的),但问题是我有运行时错误由于访问数组之外。

我可以将大小增加到 100000,但我不知道 C++ 代码会添加多少元素(即使它可以只是 1 个元素)。

那么是否存在共同的数据结构(动态数组)以供两者或其他方式使用?我正在使用 Visual Studio 2010。

我想做这样的事情。
PS:没有编译代码,这里我用的是char数组而不是int数组。

C#代码

[DllImport("example1.dll")]
private static extern int fnCPP (StringBuilder a,int size)
...

private void fnCSHARP(){
    StringBuilder buff = new StringBuilder(10000);
    int size=0;
    size = fnCPP (buff,size);
    int x = someCSHARP_fu();
    for ( int i=size; i < x+size; i++) buff[i]='x';// possibility of run time error
}

C++ 代码

int fnCPP (char *a,int size){
  int x = someOtherCpp_Function();
  for( int i=size; i < x+size ; i++) a[ i ] = 'x'; //possibility of run time error 
  return size+x;
}

【问题讨论】:

  • 你能用C++/CLI吗?你能用C++/CLI吗?
  • 您不能将项目“添加”到数组中。数组的大小是固定的。使用不同的数据结构或更改两者之间的接口方式。
  • @Jeff 不完全是“添加”,我添加了代码以从我身边清除

标签: c# c++ arrays marshalling


【解决方案1】:

有一篇很好的 MSDN 文章关于在托管代码和非托管代码 Here 之间传递数组。问题是,为什么首先需要将数组从 C# 传递到 C++?为什么你不能在 C++ 端进行分配(在你的 fnCPP 方法中),并返回一个指向 C# 代码的指针,而不是像 yet another Stackoverflow question 那样只使用 Marshal.Copy( source, destination, 0, size )?与您的 fnCSHARP 方法相比,您可以将数组的内容复制到一些可变长度的数据结构(例如列表)。

【讨论】:

  • 如果您在 C++ 中分配内存并将其返回给 C#,则需要稍后将指针传递回 C++ 以释放内存。 .NET 垃圾收集器在这里帮不了你。
猜你喜欢
  • 2020-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-27
  • 2014-07-25
  • 2017-08-08
  • 1970-01-01
  • 2012-11-08
相关资源
最近更新 更多