调用从C#获取char指针的C ++函数

时间:2014-11-05 10:16:02

标签: c# c++ interop dllimport dllexport

我无法弄清楚如何从C#传递char *到这个C ++函数。

extern "C" __declspec(dllexport)
unsigned int extractSegment(char * startPoint, unsigned int sizeToExtract)
{
//do stuff
shared_ptr<std::vector<char>> content(new std::vector<char>(startPoint,startPoint+sizeToExtract));
//do more stuff
return content->size();
}

此函数用于从文件中读取段并对其执行一些二进制操作(为什么我使用字符向量)。 startPoint是我想要阅读的段的开始。我不能改变这个功能。

在C#中,我尝试将文件读入byte []数组并定义DllImport以使用StringBuilder,其中导出具有char *。我试着这样称呼它:

byte[] arr = File.ReadAllBytes(filename);
StringBuilder sb = new StringBuilder(System.Text.Encoding.Unicode.GetString(arr, startPoint,arr.Length - startPoiunt));
extractSegment(sb,200);

这导致了SEHException。

1 个答案:

答案 0 :(得分:1)

char *可以有几种不同的含义。在您的情况下,它似乎是一个预分配和填充的字节数组,用作extractSegment函数的输入参数。

等效的C#方法将采用byte[]参数,即

[DllImport(...)]
public static extern int extractSegment(byte[] startPoint, uint sizeToExtract);

我使用byte[]因为你提到了二进制操作,但是如果它实际上是一个字符串,那么你也可以这样编组它,在DllImport中设置正确的编码属性。


仅供参考,我现在可以想到的char *的其他可能选项是ref byteout byteref charout charstring。另一方面,当调用函数分配并返回一个字符串,即StringBuilder时,使用char **