调用一个从C#中获取字符指针的C++函数

本文关键字:字符 获取 指针 函数 C++ 一个 调用 | 更新日期: 2023-09-27 18:29:23

我不知道如何从C#向这个C++函数传递char*。

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。

调用一个从C#中获取字符指针的C++函数

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

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

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

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


为了进一步了解,我现在能想到的char *的其他可能选项是ref byteout byteref charout charstring。另一方面,当调用函数分配并返回字符串时使用StringBuilder,即char **