C++中
struct rankPoint{ float sim; }; extern "C" __declspec(dllexport) int getRank(rankPoint prank[20000]){ for(int i = 0; i < 20000; i++) prank[i].sim = 0; for(int i = 0; i < 7; i++) prank[i].sim = i; return 0; }
C#中
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Runtime.InteropServices; namespace DllTest { [StructLayout(LayoutKind.Sequential)] struct rankP { public float mark; } public class Cpp { [DllImport("Cdll.dll")] public static extern int getRank(IntPtr p); } public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { int size = Marshal.SizeOf(typeof(rankP)) * 20000; byte[] bytes = new byte[size]; IntPtr pBuff = Marshal.AllocHGlobal(size); rankP[] rBuf = new rankP[20000]; Cpp.getRank(pBuff); for(int i = 0; i < 20000; i++) { IntPtr pPointor = new IntPtr(pBuff.ToInt64() + Marshal.SizeOf(typeof(rankP)) * i); rBuf[i] = (rankP)Marshal.PtrToStructure(pPointor,typeof(rankP)); } int si = 0; //设置断点监测,的确修改了rBuf数组,也就是实现了数组的传递,只不过是通过结构体实现的 Marshal.FreeHGlobal(pBuff); } } }
转一篇简单易懂的C++编写dll的文档http://wenku.baidu.com/view/ebb7e1edb8f67c1cfad6b867.html