2016-12-13 59 views
0

即時通訊編寫一個插件到C++項目,我利用UnmanagedExports Nuget包,它允許暴露在託管的.NET代碼中的C函數。 https://www.nuget.org/packages/UnmanagedExports反向pinvoke char * []使用StringBuilder

我已經寫接收的字符串(定義爲在C的char * ++) 下面是UnmanagedExport方法我已經定義爲此工作的插件。

[DllExport("GetString", CallingConvention = CallingConvention.Cdecl)] 
public static void GetString(StringBuilder MyString) 
{    
    //Use and modify the StringBuilder. It receives the string passed and returns the modified version because it is being passed by reference. 
} 

上面的代碼運行非常漂亮。

現在的問題是如何將字符串數組傳遞給我的UnmanagedExport代碼。 C++將呼叫定義爲需要char * []

這不起作用。

[DllExport("GetString", CallingConvention = CallingConvention.Cdecl)] 
public static void GetString(StringBuilder[] MyString) 
{    
} 
+1

黃金法則是先寫一個C函數,它採用相同的參數,並說,用printf()顯示它們的值。你完全有把握地發現問題:*數組有多長?*你不知道,C#不知道,Giesecke不知道。只要不理解非託管代碼,就不要跳過這一步。 –

+0

@HansPassant感謝您的輸入,指引我朝着正確的方向。我在下面添加了我的答案,但這隻允許我傳入一個字符串數組。如果對數組進行修改,則對該數組的更改不會反映在調用者代碼中。 – CathalMF

回答

0

這允許傳遞一個字符串[],但它只是一種方式。

[DllExport("GetStrings", CallingConvention = CallingConvention.Cdecl)] 
public static void GetStrings([MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)]string[] MyStrings, int size) 
{ 
    foreach(var s in MyStrings) 
    { 
     MessageBox.Show(s); 
    } 
}