2014-11-05 58 views
0

我无法弄清楚如何将char *传递给C#中的C++函数。调用一个C#函数,它需要从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 []数组,并定义了使用StringBuilder的DllImport,其中导出具有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

你可能忘记了CallingConvention.Cdecl – 2014-11-05 11:07:56

回答

1

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

等效C#方法将然后采取byte[]参数,即

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

我用byte[],因为你提到二进制运算,但是如果它实际上是一个字符串,那么你也可以元帅它是这样,在DllImport属性中设置正确的编码。我现在能想到的char *


和公正的更多信息,其他可能的选择是ref byteout byteref charout charstring。另一方面,StringBuilder用于调用函数分配并返回一个字符串,即char **

+0

好吧,但是如何获得带有偏移量的字节数组(startPoint),因为指针是不安全的。我不想每次都复制一个子数组... – Oliver 2014-11-05 11:22:12

+0

@Oliver我不知道是否有任何方法可用,不涉及创建新数组。这可能值得提出一个新问题。 – Dirk 2014-11-05 11:45:26

+0

然后使用'ref byte'并传递'ref array [index]'。 – IllidanS4 2014-11-07 20:12:54