我想將指針傳遞給從C#到C++的結構數組的指針。使用下面的代碼我只能得到C++中的第一個元素,數組中的第二個和第三個元素不會被傳遞。爲什麼?另外,嘗試使用StructureToPtr,但沒有幫助。我做錯了什麼?將指針傳遞給從C#到C++的結構數組的指針
C++代碼
struct structure
{
short ps;
};
__declspec(dllexport)short Testmethod(structure** aa)
{
if (aa!= 0 && aa[0]->ps == 26 && aa[1]->ps == 27)
{
return 1;
}
return 0;
}
C#代碼
[DllImport("Wrapper.dll", CallingConvention = CallingConvention.Cdecl)]
public unsafe static extern short Testmethod(ref IntPtr a);
[StructLayout(LayoutKind.Sequential)]
public struct SampleStructure
{
public short ps;
};
SampleStructure[] data= new SampleStructure[3] { new SampleStructure { ps = 26 }, new SampleStructure { ps = 27 }, new SampleStructure { ps = 28 } };
GCHandle gch = GCHandle.Alloc(data, GCHandleType.Pinned);
IntPtr ptr = gch.AddrOfPinnedObject();
ret = Testmethod(ref ptr);
我不能改變C++代碼,我沒有訪問它。如果以下列方式之一更改C++代碼,它就會起作用。我怎樣才能不改變c + +代碼? 更新:
方法1:作品,如果我改變C++代碼。但我無法更改C++代碼。這不是我的代碼。
C++代碼
__declspec(dllexport)short Testmethod(structure* aa)
C#代碼
fixed (SampleStructure* pArray = dataInformation)
{
ret = Testmethod(pArray);
}
方式2:作品,如果我改變C++代碼。但我無法更改C++代碼。這不是我的代碼。
C++代碼
__declspec(dllexport)short Testmethod(structure Getcsharpval[], int size)
C#代碼
public unsafe static extern short Testmethod([MarshalAs(UnmanagedType.LPArray,SizeParamIndex=3)] SampleStructure[] array);
SampleStructure[] data= new SampleStructure[3] { new SampleStructure { ps = 26 }, new SampleStructure { ps = 27 }, new SampleStructure { ps = 28 } };
ret = Testmethod(data);
我沒有太多的寫作方法適合pinvoke的經驗,但是,你是否嘗試過將C++方法的簽名更改爲'short Testmethod(structure * aa)'?編輯:另外,既然你傳遞了一個指針,你應該也可以傳遞數據的長度。 – willaien
你可以在你的項目中使用C++/Cli嗎? – alangab