2014-11-05 25 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