2012-04-04 27 views
2

我有一個調用C++函數的C#代碼。C++函數中的數組更改沒有保存在C#中

C++函數應該填充通過指針傳遞的緩衝區。但是,數組返回空。

進口聲明:

[DllImport("ProjectLogicInterface", EntryPoint = "FillArr", CallingConvention = CallingConvention.Cdecl)] 
public static extern UInt32 FillArr(char[] arr); 

的代碼,簡化後並輸入一些硬編碼值看起來像這樣:

在C#代碼:

char[] arr= new char[10]; 
ret = LogicInterface.FillArr(arr); 

的C++代碼:

bool FillArr(char* arr) 
{ 
     int length=10; 
     for(int i = 0; i < length; i++) 
     { 
       arr[i] = 3; //replaced with some hard coded value 
     } 
     return true; 
} 

但是,該陣列仍爲空。

有什麼建議嗎?

回答

1

我相信你必須在將數組傳遞給你的本地代碼前固定這個數組。這可以防止GC在C++中訪問它時在內存中移動託管數組。

所以,你可以使用:

[DllImport("ProjectLogicInterface", EntryPoint = "FillArr", CallingConvention = CallingConvention.Cdecl)] 
public static extern UInt32 FillArr(char* arr); 

然後:

char[] arr = new char[ 10 ]; 

fixed (char* pinned = arr) 
{ 
    ret = LogicInterface.FillArr(pinned); 
} 

請注意,我並沒有實際編譯和運行這一點,但它應該給你如何進行的一些想法。

1

只要C++中的代碼在返回之前不緩存它,就不需要固定數組。

在你的情況,你需要通過引用傳遞數組,所以它可以被視爲一個out參數。

[DllImport("ProjectLogicInterface", EntryPoint = "FillArr", CallingConvention = CallingConvention.Cdecl)] 
public static extern UInt32 FillArr(ref char[] arr);` 
+0

會編組,然後針罩下的內存? – Nick 2012-04-04 10:25:34

+0

是的。看到這裏:http://msdn.microsoft.com/en-us/magazine/cc163910.aspx#S2 – Pedro 2012-04-04 10:59:49

-1

發現這個鏈接有用的高度:

C#: calling C++ DLL with char** argument

最終的代碼如下所示:

[DllImport("ProjectLogicInterface", EntryPoint = "FillArr", CallingConvention = CallingConvention.Cdecl)] 
    static extern bool FillArr([MarshalAs(UnmanagedType.LPStr, ArraySubType = UnmanagedType.LPStr)] StringBuilder args); 

     static void Main(string[] args) 
     { 
      StringBuilder arr = new StringBuilder(9); 
      bool res = FillArr(arr); 
     } 
+0

啊,你是編組字符串......不只是在原始問題中描述的字符數組。 – Nick 2012-04-04 12:07:14

+0

@Nick我寧願使用char數組,但它不起作用。你的答案和另一個答案也沒有。這樣我可以將它解析回字符串,並將其用作字符數組。 – sara 2012-04-04 12:18:59