我无法弄清楚如何从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。
答案 0 :(得分:1)
char *
可以有几种不同的含义。在您的情况下,它似乎是一个预分配和填充的字节数组,用作extractSegment
函数的输入参数。
等效的C#方法将采用byte[]
参数,即
[DllImport(...)]
public static extern int extractSegment(byte[] startPoint, uint sizeToExtract);
我使用byte[]
因为你提到了二进制操作,但是如果它实际上是一个字符串,那么你也可以这样编组它,在DllImport
中设置正确的编码属性。
仅供参考,我现在可以想到的char *
的其他可能选项是ref byte
,out byte
,ref char
,out char
或string
。另一方面,当调用函数分配并返回一个字符串,即StringBuilder
时,使用char **
。